]> granicus.if.org Git - postgresql/commitdiff
Copy collencoding in CREATE COLLATION / FROM
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 30 Jun 2017 12:50:39 +0000 (08:50 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 30 Jun 2017 12:50:39 +0000 (08:50 -0400)
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 <tgl@sss.pgh.pa.us>
src/backend/commands/collationcmds.c

index 7f2ce4db4c67e463494c654cabbb6686e4992f59..418f7342c77fccb4c7bb5783cdf1f6f5b343b35d 100644 (file)
@@ -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)