DefineCollation() code cleanup
authorPeter Eisentraut
Fri, 11 Mar 2022 07:27:24 +0000 (08:27 +0100)
committerPeter Eisentraut
Fri, 11 Mar 2022 07:32:52 +0000 (08:32 +0100)
Reorganize the code in DefineCollation() so that the parts using the
FROM clause and the parts not doing so are more cleanly separated.  No
functionality change intended.

Reviewed-by: Julien Rouhaud
Discussion: https://www.postgresql.org/message-id/29ae752f-80e9-8d31-601c-62cf01cc93d8@enterprisedb.com

src/backend/commands/collationcmds.c

index 12fc2316f974c51b43e5c044085a477367bce291..93df1d366c6e3393483aea4e3cd7506a02b88e4e 100644 (file)
@@ -63,12 +63,11 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
    DefElem    *providerEl = NULL;
    DefElem    *deterministicEl = NULL;
    DefElem    *versionEl = NULL;
-   char       *collcollate = NULL;
-   char       *collctype = NULL;
-   char       *collproviderstr = NULL;
-   bool        collisdeterministic = true;
-   int         collencoding = 0;
-   char        collprovider = 0;
+   char       *collcollate;
+   char       *collctype;
+   bool        collisdeterministic;
+   int         collencoding;
+   char        collprovider;
    char       *collversion = NULL;
    Oid         newoid;
    ObjectAddress address;
@@ -167,65 +166,71 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
                    (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
                     errmsg("collation \"default\" cannot be copied")));
    }
-
-   if (localeEl)
+   else
    {
-       collcollate = defGetString(localeEl);
-       collctype = defGetString(localeEl);
-   }
+       char       *collproviderstr = NULL;
 
-   if (lccollateEl)
-       collcollate = defGetString(lccollateEl);
+       collcollate = NULL;
+       collctype = NULL;
 
-   if (lcctypeEl)
-       collctype = defGetString(lcctypeEl);
+       if (localeEl)
+       {
+           collcollate = defGetString(localeEl);
+           collctype = defGetString(localeEl);
+       }
 
-   if (providerEl)
-       collproviderstr = defGetString(providerEl);
+       if (lccollateEl)
+           collcollate = defGetString(lccollateEl);
 
-   if (deterministicEl)
-       collisdeterministic = defGetBoolean(deterministicEl);
+       if (lcctypeEl)
+           collctype = defGetString(lcctypeEl);
 
-   if (versionEl)
-       collversion = defGetString(versionEl);
+       if (providerEl)
+           collproviderstr = defGetString(providerEl);
 
-   if (collproviderstr)
-   {
-       if (pg_strcasecmp(collproviderstr, "icu") == 0)
-           collprovider = COLLPROVIDER_ICU;
-       else if (pg_strcasecmp(collproviderstr, "libc") == 0)
-           collprovider = COLLPROVIDER_LIBC;
+       if (deterministicEl)
+           collisdeterministic = defGetBoolean(deterministicEl);
+       else
+           collisdeterministic = true;
+
+       if (versionEl)
+           collversion = defGetString(versionEl);
+
+       if (collproviderstr)
+       {
+           if (pg_strcasecmp(collproviderstr, "icu") == 0)
+               collprovider = COLLPROVIDER_ICU;
+           else if (pg_strcasecmp(collproviderstr, "libc") == 0)
+               collprovider = COLLPROVIDER_LIBC;
+           else
+               ereport(ERROR,
+                       (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+                        errmsg("unrecognized collation provider: %s",
+                               collproviderstr)));
+       }
        else
+           collprovider = COLLPROVIDER_LIBC;
+
+       if (!collcollate)
            ereport(ERROR,
                    (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
-                    errmsg("unrecognized collation provider: %s",
-                           collproviderstr)));
-   }
-   else if (!fromEl)
-       collprovider = COLLPROVIDER_LIBC;
-
-   if (!collcollate)
-       ereport(ERROR,
-               (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
-                errmsg("parameter \"lc_collate\" must be specified")));
+                    errmsg("parameter \"lc_collate\" must be specified")));
 
-   if (!collctype)
-       ereport(ERROR,
-               (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
-                errmsg("parameter \"lc_ctype\" must be specified")));
+       if (!collctype)
+           ereport(ERROR,
+                   (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+                    errmsg("parameter \"lc_ctype\" must be specified")));
 
-   /*
-    * Nondeterministic collations are currently only supported with ICU
-    * because that's the only case where it can actually make a difference.
-    * So we can save writing the code for the other providers.
-    */
-   if (!collisdeterministic && collprovider != COLLPROVIDER_ICU)
-       ereport(ERROR,
-               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                errmsg("nondeterministic collations not supported with this provider")));
+       /*
+        * Nondeterministic collations are currently only supported with ICU
+        * because that's the only case where it can actually make a difference.
+        * So we can save writing the code for the other providers.
+        */
+       if (!collisdeterministic && collprovider != COLLPROVIDER_ICU)
+           ereport(ERROR,
+                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                    errmsg("nondeterministic collations not supported with this provider")));
 
-   if (!fromEl)
-   {
        if (collprovider == COLLPROVIDER_ICU)
        {
 #ifdef USE_ICU