From ca6c6e4c7a42eb02ddf3e9e6e1669f433b72f77b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 14 Aug 2017 13:18:57 -0400 Subject: [RFC PATCH] Add CREATE COLLATION auto_comment option --- src/backend/commands/collationcmds.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index 96a6bc9bf0..d5a4dcbdbd 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -37,6 +37,11 @@ #include "utils/syscache.h" +#ifdef USE_ICU +static char *get_icu_locale_comment(const char *localename); +#endif + + typedef struct { char *localename; /* name of locale, as per "locale -a" */ @@ -56,11 +61,13 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e AclResult aclresult; ListCell *pl; DefElem *fromEl = NULL; + DefElem *autocommentEl = NULL; DefElem *localeEl = NULL; DefElem *lccollateEl = NULL; DefElem *lcctypeEl = NULL; DefElem *providerEl = NULL; DefElem *versionEl = NULL; + bool autocomment = false; char *collcollate = NULL; char *collctype = NULL; char *collproviderstr = NULL; @@ -84,6 +91,8 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e if (pg_strcasecmp(defel->defname, "from") == 0) defelp = &fromEl; + else if (pg_strcasecmp(defel->defname, "auto_comment") == 0) + defelp = &autocommentEl; else if (pg_strcasecmp(defel->defname, "locale") == 0) defelp = &localeEl; else if (pg_strcasecmp(defel->defname, "lc_collate") == 0) @@ -143,6 +152,9 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e errmsg("collation \"default\" cannot be copied"))); } + if (autocommentEl) + autocomment = defGetBoolean(autocommentEl); + if (localeEl) { collcollate = defGetString(localeEl); @@ -224,6 +236,18 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e ObjectAddressSet(address, CollationRelationId, newoid); +#ifdef USE_ICU + if (autocomment && collprovider == COLLPROVIDER_ICU) + { + char *icucomment; + + icucomment = get_icu_locale_comment(collcollate); + if (icucomment) + CreateComments(newoid, CollationRelationId, 0, + icucomment); + } +#endif + return address; } base-commit: ea0ca75d5d14e0c98782a2188405685af4a475a0 -- 2.14.1