Re: pg_trgm comparison bug on cross-architecture replication due to different char implementation
Noah Misch <noah@leadboat.com>
From: Noah Misch <noah@leadboat.com>
To: Masahiko Sawada <sawada.mshk@gmail.com>
Cc: Joe Conway <mail@joeconway.com>, Peter Eisentraut <peter@eisentraut.org>, Tom Lane <tgl@sss.pgh.pa.us>, Alexander Korotkov <aekorotkov@gmail.com>, "Guo, Adam" <adamguo@amazon.com>, "pgsql-hackers@lists.postgresql.org" <pgsql-hackers@lists.postgresql.org>, Nathan Bossart <nathandbossart@gmail.com>, Jim Mlodgenski <jimmy76@gmail.com>
Date: 2024-08-31T03:10:38Z
Lists: pgsql-hackers
On Thu, Aug 29, 2024 at 03:48:53PM -0500, Masahiko Sawada wrote: > On Sun, May 19, 2024 at 6:46 AM Noah Misch <noah@leadboat.com> wrote: > > If I were standardizing pg_trgm on one or the other notion of "char", I would > > choose signed char, since I think it's still the majority. More broadly, I > > see these options to fix pg_trgm: > > > > 1. Change to signed char. Every arm64 system needs to scan pg_trgm indexes. > > 2. Change to unsigned char. Every x86 system needs to scan pg_trgm indexes. > > Even though it's true that signed char systems are the majority, it > would not be acceptable to force the need to scan pg_trgm indexes on > unsigned char systems. > > > 3. Offer both, as an upgrade path. For example, pg_trgm could have separate > > operator classes gin_trgm_ops and gin_trgm_ops_unsigned. Running > > pg_upgrade on an unsigned-char system would automatically map v17 > > gin_trgm_ops to v18 gin_trgm_ops_unsigned. This avoids penalizing any > > architecture with upgrade-time scans. > > Very interesting idea. How can new v18 users use the correct operator > class? I don't want to require users to specify the correct signed or > unsigned operator classes when creating a GIN index. Maybe we need to In brief, it wouldn't matter which operator class new v18 indexes use. The documentation would focus on gin_trgm_ops and also say something like: There's an additional operator class, gin_trgm_ops_unsigned. It behaves exactly like gin_trgm_ops, but it uses a deprecated on-disk representation. Use gin_trgm_ops in new indexes, but there's no disadvantage from continuing to use gin_trgm_ops_unsigned. Before PostgreSQL 18, gin_trgm_ops used a platform-dependent representation. pg_upgrade automatically uses gin_trgm_ops_unsigned when upgrading from source data that used the deprecated representation. What concerns might users have, then? (Neither operator class would use plain "char" in a context that affects on-disk state. They'll use "signed char" and "unsigned char".) > dynamically use the correct compare function for the same operator > class depending on the char signedness. But is it possible to do it on > the extension (e.g. pg_trgm) side? No, I don't think the extension can do that cleanly. It would need to store the signedness in the index somehow, and GIN doesn't call the opclass at a time facilitating that. That would need help from the core server.
Commits
-
pg_upgrade: Check for the expected error message in TAP tests.
- f52345995d36 18.0 landed
-
Fix a typo in 005_char_signedness.pl test.
- 945a9e3832c3 18.0 landed
-
Add test 005_char_signedness.pl to meson.build.
- 78d3f4889502 18.0 landed
-
Fix an issue with index scan using pg_trgm due to char signedness on different architectures.
- dfd8e6c73eea 18.0 landed
-
pg_upgrade: Add --set-char-signedness to set the default char signedness of new cluster.
- 1aab6805919b 18.0 landed
-
pg_upgrade: Preserve default char signedness value from old cluster.
- a8238f87f980 18.0 landed
-
pg_resetwal: Add --char-signedness option to change the default char signedness.
- 30666d1857d7 18.0 landed
-
Add default_char_signedness field to ControlFileData.
- 44fe30fdab67 18.0 landed
-
Remove unneeded nbtree array preprocessing assert.
- 480bc6e3ed3a 17.0 cited