From 54baa48139ae6b67347bea6a9183d494e625939b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 30 Jun 2017 08:50:39 -0400 Subject: [PATCH] Copy collencoding in CREATE COLLATION / FROM This command used to compute the collencoding entry like when a completely new collation is created. But for example when copying the "C" collation, this would then result in a collation that has a collencoding entry for the current database encoding rather than -1, thus not making an exact copy. This has probably no practical impact, but making this change keeps the catalog contents neat. Reported-by: Tom Lane --- src/backend/commands/collationcmds.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index 7f2ce4db4c..418f7342c7 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -64,7 +64,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e char *collcollate = NULL; char *collctype = NULL; char *collproviderstr = NULL; - int collencoding; + int collencoding = 0; char collprovider = 0; char *collversion = NULL; Oid newoid; @@ -126,6 +126,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e collcollate = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collcollate)); collctype = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collctype)); collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider; + collencoding = ((Form_pg_collation) GETSTRUCT(tp))->collencoding; ReleaseSysCache(tp); @@ -185,12 +186,15 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("parameter \"lc_ctype\" must be specified"))); - if (collprovider == COLLPROVIDER_ICU) - collencoding = -1; - else + if (!fromEl) { - collencoding = GetDatabaseEncoding(); - check_encoding_locale_matches(collencoding, collcollate, collctype); + if (collprovider == COLLPROVIDER_ICU) + collencoding = -1; + else + { + collencoding = GetDatabaseEncoding(); + check_encoding_locale_matches(collencoding, collcollate, collctype); + } } if (!collversion) -- 2.40.0