Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 82d4a2a

Browse files
committed
Enable hash partitioning of text arrays
hash_array_extended() needs to pass PG_GET_COLLATION() to the hash function of the element type. Otherwise, the hash function of a collation-aware data type such as text will error out, since the introduction of nondeterministic collation made hash functions require a collation, too. The consequence of this is that before this change, hash partitioning using an array over text in the partition key would not work. Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://www.postgresql.org/message-id/flat/32c1fdae-95c6-5dc6-058a-a90330a3b621%40enterprisedb.com
1 parent 7d39586 commit 82d4a2a

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

src/backend/utils/adt/arrayfuncs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4050,7 +4050,7 @@ hash_array_extended(PG_FUNCTION_ARGS)
40504050
typalign = typentry->typalign;
40514051

40524052
InitFunctionCallInfoData(*locfcinfo, &typentry->hash_extended_proc_finfo, 2,
4053-
InvalidOid, NULL, NULL);
4053+
PG_GET_COLLATION(), NULL, NULL);
40544054

40554055
/* Loop over source data */
40564056
nitems = ArrayGetNItems(ndims, dims);

src/test/regress/expected/collate.icu.utf8.out

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,30 @@ SELECT * FROM test6 WHERE b = 'äbc' COLLATE ctest_nondet;
12151215
2 | äbc
12161216
(2 rows)
12171217

1218+
-- same with arrays
1219+
CREATE TABLE test6a (a int, b text[]);
1220+
INSERT INTO test6a VALUES (1, ARRAY[U&'\00E4bc']);
1221+
INSERT INTO test6a VALUES (2, ARRAY[U&'\0061\0308bc']);
1222+
SELECT * FROM test6a;
1223+
a | b
1224+
---+-------
1225+
1 | {äbc}
1226+
2 | {äbc}
1227+
(2 rows)
1228+
1229+
SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_det;
1230+
a | b
1231+
---+-------
1232+
1 | {äbc}
1233+
(1 row)
1234+
1235+
SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_nondet;
1236+
a | b
1237+
---+-------
1238+
1 | {äbc}
1239+
2 | {äbc}
1240+
(2 rows)
1241+
12181242
CREATE COLLATION case_sensitive (provider = icu, locale = '');
12191243
CREATE COLLATION case_insensitive (provider = icu, locale = '@colStrength=secondary', deterministic = false);
12201244
SELECT 'abc' <= 'ABC' COLLATE case_sensitive, 'abc' >= 'ABC' COLLATE case_sensitive;
@@ -1842,6 +1866,19 @@ SELECT (SELECT count(*) FROM test22_0) = (SELECT count(*) FROM test22_1);
18421866
t
18431867
(1 row)
18441868

1869+
-- same with arrays
1870+
CREATE TABLE test22a (a int, b text[] COLLATE case_sensitive) PARTITION BY HASH (b);
1871+
CREATE TABLE test22a_0 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 0);
1872+
CREATE TABLE test22a_1 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 1);
1873+
INSERT INTO test22a VALUES (1, ARRAY['def']);
1874+
INSERT INTO test22a VALUES (2, ARRAY['DEF']);
1875+
-- they end up in different partitions
1876+
SELECT (SELECT count(*) FROM test22a_0) = (SELECT count(*) FROM test22a_1);
1877+
?column?
1878+
----------
1879+
t
1880+
(1 row)
1881+
18451882
CREATE TABLE test23 (a int, b text COLLATE case_insensitive) PARTITION BY HASH (b);
18461883
CREATE TABLE test23_0 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 0);
18471884
CREATE TABLE test23_1 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 1);
@@ -1854,6 +1891,19 @@ SELECT (SELECT count(*) FROM test23_0) <> (SELECT count(*) FROM test23_1);
18541891
t
18551892
(1 row)
18561893

1894+
-- same with arrays
1895+
CREATE TABLE test23a (a int, b text[] COLLATE case_insensitive) PARTITION BY HASH (b);
1896+
CREATE TABLE test23a_0 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 0);
1897+
CREATE TABLE test23a_1 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 1);
1898+
INSERT INTO test23a VALUES (1, ARRAY['def']);
1899+
INSERT INTO test23a VALUES (2, ARRAY['DEF']);
1900+
-- they end up in the same partition (but it's platform-dependent which one)
1901+
SELECT (SELECT count(*) FROM test23a_0) <> (SELECT count(*) FROM test23a_1);
1902+
?column?
1903+
----------
1904+
t
1905+
(1 row)
1906+
18571907
CREATE TABLE test30 (a int, b char(3) COLLATE case_insensitive) PARTITION BY LIST (b);
18581908
CREATE TABLE test30_1 PARTITION OF test30 FOR VALUES IN ('abc');
18591909
INSERT INTO test30 VALUES (1, 'abc');

src/test/regress/sql/collate.icu.utf8.sql

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,14 @@ SELECT * FROM test6;
483483
SELECT * FROM test6 WHERE b = 'äbc' COLLATE ctest_det;
484484
SELECT * FROM test6 WHERE b = 'äbc' COLLATE ctest_nondet;
485485

486+
-- same with arrays
487+
CREATE TABLE test6a (a int, b text[]);
488+
INSERT INTO test6a VALUES (1, ARRAY[U&'\00E4bc']);
489+
INSERT INTO test6a VALUES (2, ARRAY[U&'\0061\0308bc']);
490+
SELECT * FROM test6a;
491+
SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_det;
492+
SELECT * FROM test6a WHERE b = ARRAY['äbc'] COLLATE ctest_nondet;
493+
486494
CREATE COLLATION case_sensitive (provider = icu, locale = '');
487495
CREATE COLLATION case_insensitive (provider = icu, locale = '@colStrength=secondary', deterministic = false);
488496

@@ -685,6 +693,15 @@ INSERT INTO test22 VALUES (2, 'DEF');
685693
-- they end up in different partitions
686694
SELECT (SELECT count(*) FROM test22_0) = (SELECT count(*) FROM test22_1);
687695

696+
-- same with arrays
697+
CREATE TABLE test22a (a int, b text[] COLLATE case_sensitive) PARTITION BY HASH (b);
698+
CREATE TABLE test22a_0 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 0);
699+
CREATE TABLE test22a_1 PARTITION OF test22a FOR VALUES WITH (MODULUS 2, REMAINDER 1);
700+
INSERT INTO test22a VALUES (1, ARRAY['def']);
701+
INSERT INTO test22a VALUES (2, ARRAY['DEF']);
702+
-- they end up in different partitions
703+
SELECT (SELECT count(*) FROM test22a_0) = (SELECT count(*) FROM test22a_1);
704+
688705
CREATE TABLE test23 (a int, b text COLLATE case_insensitive) PARTITION BY HASH (b);
689706
CREATE TABLE test23_0 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 0);
690707
CREATE TABLE test23_1 PARTITION OF test23 FOR VALUES WITH (MODULUS 2, REMAINDER 1);
@@ -693,6 +710,15 @@ INSERT INTO test23 VALUES (2, 'DEF');
693710
-- they end up in the same partition (but it's platform-dependent which one)
694711
SELECT (SELECT count(*) FROM test23_0) <> (SELECT count(*) FROM test23_1);
695712

713+
-- same with arrays
714+
CREATE TABLE test23a (a int, b text[] COLLATE case_insensitive) PARTITION BY HASH (b);
715+
CREATE TABLE test23a_0 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 0);
716+
CREATE TABLE test23a_1 PARTITION OF test23a FOR VALUES WITH (MODULUS 2, REMAINDER 1);
717+
INSERT INTO test23a VALUES (1, ARRAY['def']);
718+
INSERT INTO test23a VALUES (2, ARRAY['DEF']);
719+
-- they end up in the same partition (but it's platform-dependent which one)
720+
SELECT (SELECT count(*) FROM test23a_0) <> (SELECT count(*) FROM test23a_1);
721+
696722
CREATE TABLE test30 (a int, b char(3) COLLATE case_insensitive) PARTITION BY LIST (b);
697723
CREATE TABLE test30_1 PARTITION OF test30 FOR VALUES IN ('abc');
698724
INSERT INTO test30 VALUES (1, 'abc');

0 commit comments

Comments
 (0)