diff options
author | Peter Eisentraut | 2017-06-30 12:50:39 +0000 |
---|---|---|
committer | Peter Eisentraut | 2017-06-30 12:50:39 +0000 |
commit | 54baa48139ae6b67347bea6a9183d494e625939b (patch) | |
tree | 01daab4bc29f542d12c2695e2806010d9f9036fa | |
parent | 08aed6604de2e6a9f4d499818d7c641cbf5eb9f7 (diff) |
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 <[email protected]>
-rw-r--r-- | src/backend/commands/collationcmds.c | 16 |
1 files 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) |