mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-11 10:33:24 +02:00
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 <tgl@sss.pgh.pa.us>
This commit is contained in:
parent
08aed6604d
commit
54baa48139
@ -64,7 +64,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
|
|||||||
char *collcollate = NULL;
|
char *collcollate = NULL;
|
||||||
char *collctype = NULL;
|
char *collctype = NULL;
|
||||||
char *collproviderstr = NULL;
|
char *collproviderstr = NULL;
|
||||||
int collencoding;
|
int collencoding = 0;
|
||||||
char collprovider = 0;
|
char collprovider = 0;
|
||||||
char *collversion = NULL;
|
char *collversion = NULL;
|
||||||
Oid newoid;
|
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));
|
collcollate = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collcollate));
|
||||||
collctype = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collctype));
|
collctype = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collctype));
|
||||||
collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider;
|
collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider;
|
||||||
|
collencoding = ((Form_pg_collation) GETSTRUCT(tp))->collencoding;
|
||||||
|
|
||||||
ReleaseSysCache(tp);
|
ReleaseSysCache(tp);
|
||||||
|
|
||||||
@ -185,12 +186,15 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
|
|||||||
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
||||||
errmsg("parameter \"lc_ctype\" must be specified")));
|
errmsg("parameter \"lc_ctype\" must be specified")));
|
||||||
|
|
||||||
if (collprovider == COLLPROVIDER_ICU)
|
if (!fromEl)
|
||||||
collencoding = -1;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
collencoding = GetDatabaseEncoding();
|
if (collprovider == COLLPROVIDER_ICU)
|
||||||
check_encoding_locale_matches(collencoding, collcollate, collctype);
|
collencoding = -1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
collencoding = GetDatabaseEncoding();
|
||||||
|
check_encoding_locale_matches(collencoding, collcollate, collctype);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!collversion)
|
if (!collversion)
|
||||||
|
Loading…
Reference in New Issue
Block a user