@@ -64,10 +64,12 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
6464 DefElem * lcctypeEl = NULL ;
6565 DefElem * providerEl = NULL ;
6666 DefElem * deterministicEl = NULL ;
67+ DefElem * rulesEl = NULL ;
6768 DefElem * versionEl = NULL ;
6869 char * collcollate ;
6970 char * collctype ;
7071 char * colliculocale ;
72+ char * collicurules ;
7173 bool collisdeterministic ;
7274 int collencoding ;
7375 char collprovider ;
@@ -99,6 +101,8 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
99101 defelp = & providerEl ;
100102 else if (strcmp (defel -> defname , "deterministic" ) == 0 )
101103 defelp = & deterministicEl ;
104+ else if (strcmp (defel -> defname , "rules" ) == 0 )
105+ defelp = & rulesEl ;
102106 else if (strcmp (defel -> defname , "version" ) == 0 )
103107 defelp = & versionEl ;
104108 else
@@ -161,6 +165,12 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
161165 else
162166 colliculocale = NULL ;
163167
168+ datum = SysCacheGetAttr (COLLOID , tp , Anum_pg_collation_collicurules , & isnull );
169+ if (!isnull )
170+ collicurules = TextDatumGetCString (datum );
171+ else
172+ collicurules = NULL ;
173+
164174 ReleaseSysCache (tp );
165175
166176 /*
@@ -182,6 +192,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
182192 collcollate = NULL ;
183193 collctype = NULL ;
184194 colliculocale = NULL ;
195+ collicurules = NULL ;
185196
186197 if (providerEl )
187198 collproviderstr = defGetString (providerEl );
@@ -191,6 +202,9 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
191202 else
192203 collisdeterministic = true;
193204
205+ if (rulesEl )
206+ collicurules = defGetString (rulesEl );
207+
194208 if (versionEl )
195209 collversion = defGetString (versionEl );
196210
@@ -297,6 +311,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
297311 collcollate ,
298312 collctype ,
299313 colliculocale ,
314+ collicurules ,
300315 collversion ,
301316 if_not_exists ,
302317 false); /* not quiet */
@@ -680,7 +695,7 @@ create_collation_from_locale(const char *locale, int nspid,
680695 */
681696 collid = CollationCreate (locale , nspid , GetUserId (),
682697 COLLPROVIDER_LIBC , true, enc ,
683- locale , locale , NULL ,
698+ locale , locale , NULL , NULL ,
684699 get_collation_actual_version (COLLPROVIDER_LIBC , locale ),
685700 true, true);
686701 if (OidIsValid (collid ))
@@ -755,7 +770,7 @@ win32_read_locale(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
755770
756771 collid = CollationCreate (alias , param -> nspid , GetUserId (),
757772 COLLPROVIDER_LIBC , true, enc ,
758- localebuf , localebuf , NULL ,
773+ localebuf , localebuf , NULL , NULL ,
759774 get_collation_actual_version (COLLPROVIDER_LIBC , localebuf ),
760775 true, true);
761776 if (OidIsValid (collid ))
@@ -889,7 +904,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS)
889904
890905 collid = CollationCreate (alias , nspid , GetUserId (),
891906 COLLPROVIDER_LIBC , true, enc ,
892- locale , locale , NULL ,
907+ locale , locale , NULL , NULL ,
893908 get_collation_actual_version (COLLPROVIDER_LIBC , locale ),
894909 true, true);
895910 if (OidIsValid (collid ))
@@ -951,7 +966,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS)
951966 collid = CollationCreate (psprintf ("%s-x-icu" , langtag ),
952967 nspid , GetUserId (),
953968 COLLPROVIDER_ICU , true, -1 ,
954- NULL , NULL , iculocstr ,
969+ NULL , NULL , iculocstr , NULL ,
955970 get_collation_actual_version (COLLPROVIDER_ICU , iculocstr ),
956971 true, true);
957972 if (OidIsValid (collid ))
0 commit comments