diff --git a/src/backend/distributed/commands/collation.c b/src/backend/distributed/commands/collation.c index eb4dd965497..023197e158d 100644 --- a/src/backend/distributed/commands/collation.c +++ b/src/backend/distributed/commands/collation.c @@ -188,7 +188,16 @@ CreateCollationDDLInternal(Oid collationId, Oid *collowner, char **quotedCollati pfree(collcollate); pfree(collctype); #endif - +#if PG_VERSION_NUM >= PG_VERSION_16 + char *collicurules = NULL; + datum = SysCacheGetAttr(COLLOID, heapTuple, Anum_pg_collation_collicurules, &isnull); + if (!isnull) + { + collicurules = TextDatumGetCString(datum); + appendStringInfo(&collationNameDef, ", rules = %s", + quote_literal_cstr(collicurules)); + } +#endif if (!collisdeterministic) { appendStringInfoString(&collationNameDef, ", deterministic = false"); diff --git a/src/test/regress/expected/pg16.out b/src/test/regress/expected/pg16.out index be4afc98105..95a1f9dd63f 100644 --- a/src/test/regress/expected/pg16.out +++ b/src/test/regress/expected/pg16.out @@ -313,6 +313,90 @@ SELECT result FROM run_command_on_workers DROP DATABASE (2 rows) +SET search_path TO pg16; +-- New rules option added to CREATE COLLATION +-- Similar to above test with CREATE DATABASE +-- Relevant PG commit: +-- https://github.com/postgres/postgres/commit/30a53b7 +CREATE COLLATION default_rule (provider = icu, locale = ''); +NOTICE: using standard form "und" for ICU locale "" +CREATE COLLATION special_rule (provider = icu, locale = '', rules = '&a < g'); +NOTICE: using standard form "und" for ICU locale "" +CREATE TABLE test_collation_rules (a text); +SELECT create_distributed_table('test_collation_rules', 'a'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +INSERT INTO test_collation_rules VALUES ('Abernathy'), ('apple'), ('bird'), ('Boston'), ('Graham'), ('green'); +SELECT collname, collprovider, colliculocale, collicurules +FROM pg_collation +WHERE collname like '%_rule%' +ORDER BY 1; + collname | collprovider | colliculocale | collicurules +--------------------------------------------------------------------- + default_rule | i | und | + special_rule | i | und | &a < g +(2 rows) + +SELECT * FROM test_collation_rules ORDER BY a COLLATE default_rule; + a +--------------------------------------------------------------------- + Abernathy + apple + bird + Boston + Graham + green +(6 rows) + +SELECT * FROM test_collation_rules ORDER BY a COLLATE special_rule; + a +--------------------------------------------------------------------- + Abernathy + apple + green + bird + Boston + Graham +(6 rows) + +\c - - - :worker_1_port +SET search_path TO pg16; +SELECT collname, collprovider, colliculocale, collicurules +FROM pg_collation +WHERE collname like '%_rule%' +ORDER BY 1; + collname | collprovider | colliculocale | collicurules +--------------------------------------------------------------------- + default_rule | i | und | + special_rule | i | und | &a < g +(2 rows) + +SELECT * FROM test_collation_rules ORDER BY a COLLATE default_rule; + a +--------------------------------------------------------------------- + Abernathy + apple + bird + Boston + Graham + green +(6 rows) + +SELECT * FROM test_collation_rules ORDER BY a COLLATE special_rule; + a +--------------------------------------------------------------------- + Abernathy + apple + green + bird + Boston + Graham +(6 rows) + +\c - - - :master_port SET search_path TO pg16; SET citus.next_shard_id TO 951000; -- Foreign table TRUNCATE trigger diff --git a/src/test/regress/sql/pg16.sql b/src/test/regress/sql/pg16.sql index 47c17e72d65..99732798d38 100644 --- a/src/test/regress/sql/pg16.sql +++ b/src/test/regress/sql/pg16.sql @@ -146,6 +146,40 @@ DROP DATABASE test_db; SELECT result FROM run_command_on_workers ($$DROP DATABASE test_db$$); SET search_path TO pg16; + +-- New rules option added to CREATE COLLATION +-- Similar to above test with CREATE DATABASE +-- Relevant PG commit: +-- https://github.com/postgres/postgres/commit/30a53b7 + +CREATE COLLATION default_rule (provider = icu, locale = ''); +CREATE COLLATION special_rule (provider = icu, locale = '', rules = '&a < g'); + +CREATE TABLE test_collation_rules (a text); +SELECT create_distributed_table('test_collation_rules', 'a'); +INSERT INTO test_collation_rules VALUES ('Abernathy'), ('apple'), ('bird'), ('Boston'), ('Graham'), ('green'); + +SELECT collname, collprovider, colliculocale, collicurules +FROM pg_collation +WHERE collname like '%_rule%' +ORDER BY 1; + +SELECT * FROM test_collation_rules ORDER BY a COLLATE default_rule; +SELECT * FROM test_collation_rules ORDER BY a COLLATE special_rule; + +\c - - - :worker_1_port +SET search_path TO pg16; + +SELECT collname, collprovider, colliculocale, collicurules +FROM pg_collation +WHERE collname like '%_rule%' +ORDER BY 1; + +SELECT * FROM test_collation_rules ORDER BY a COLLATE default_rule; +SELECT * FROM test_collation_rules ORDER BY a COLLATE special_rule; + +\c - - - :master_port +SET search_path TO pg16; SET citus.next_shard_id TO 951000; -- Foreign table TRUNCATE trigger