Fix broken hash function hashbpcharextended().
authorJeff Davis <jdavis@postgresql.org>
Thu, 1 Dec 2022 19:08:47 +0000 (11:08 -0800)
committerJeff Davis <jdavis@postgresql.org>
Fri, 2 Dec 2022 22:06:31 +0000 (14:06 -0800)
Ignore trailing spaces for non-deterministic collations when
hashing.

The previous behavior could lead to tuples falling into the wrong
partitions when hash partitioning is combined with the BPCHAR type and
a non-deterministic collation. Fortunately, it did not affect hash
indexes, because hash indexes do not use extended hash functions.

Decline to backpatch, per discussion.

Discussion: https://postgr.es/m/eb83d0ac7b299eb08f9b900dd08a5a0c5d90e517.camel@j-davis.com
Reviewed-by: Richard Guo, Tom Lane
src/backend/utils/adt/varchar.c

index 09c483d6ff85c3a5cb76ff598a0914ffdfcec2c0..a63c498181e1895b71f65e79aaa19b484653f4c9 100644 (file)
@@ -1086,7 +1086,7 @@ hashbpcharextended(PG_FUNCTION_ARGS)
            Size        bsize;
            uint8_t    *buf;
 
-           ulen = icu_to_uchar(&uchar, VARDATA_ANY(key), VARSIZE_ANY_EXHDR(key));
+           ulen = icu_to_uchar(&uchar, keydata, keylen);
 
            bsize = ucol_getSortKey(mylocale->info.icu.ucol,
                                    uchar, ulen, NULL, 0);