Modify initdb to complain only when no usable system locales are found.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Apr 2011 19:38:57 +0000 (15:38 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Apr 2011 19:39:25 +0000 (15:39 -0400)
Per discussion, the original behavior seems too noisy.  But if things
are so broken that none of the locales reported by "locale -a" are usable,
that's probably worth warning about.

src/bin/initdb/initdb.c

index 4db34e5f2ea408523921b728902da4992713d6f5..9ea2ea39cee2346d5b4ee97f74a3f80e218d0e4b 100644 (file)
@@ -1564,7 +1564,7 @@ setup_collation(void)
        int i;
        FILE   *locale_a_handle;
        char    localebuf[NAMEDATALEN];
-       int             skipped = 0;
+       int             count = 0;
        PG_CMD_DECL;
 #endif
 
@@ -1579,7 +1579,7 @@ setup_collation(void)
 
        locale_a_handle = popen_check("locale -a", "r");
        if (!locale_a_handle)
-               return;
+               return;                                 /* complaint already printed */
 
        PG_CMD_OPEN;
 
@@ -1597,12 +1597,11 @@ setup_collation(void)
 
                len = strlen(localebuf);
 
-               if (localebuf[len - 1] != '\n')
+               if (len == 0 || localebuf[len - 1] != '\n')
                {
                        if (debug)
                                fprintf(stderr, _("%s: locale name too long, skipped: %s\n"),
                                                progname, localebuf);
-                       skipped++;
                        continue;
                }
                localebuf[len - 1] = '\0';
@@ -1628,22 +1627,23 @@ setup_collation(void)
                        if (debug)
                                fprintf(stderr, _("%s: locale name has non-ASCII characters, skipped: %s\n"),
                                                progname, localebuf);
-                       skipped++;
                        continue;
                }
 
                enc = pg_get_encoding_from_locale(localebuf, debug);
                if (enc < 0)
                {
-                       skipped++;
-                       continue;                       /* error message printed by pg_get_encoding_from_locale() */
+                       /* error message printed by pg_get_encoding_from_locale() */
+                       continue;
                }
                if (!PG_VALID_BE_ENCODING(enc))
                        continue;                       /* ignore locales for client-only encodings */
                if (enc == PG_SQL_ASCII)
                        continue;                       /* C/POSIX are already in the catalog */
 
-               PG_CMD_PRINTF2("INSERT INTO tmp_pg_collation (locale, encoding) VALUES ('%s', %d);",
+               count++;
+
+               PG_CMD_PRINTF2("INSERT INTO tmp_pg_collation (locale, encoding) VALUES ('%s', %d);\n",
                                           escape_quotes(localebuf), enc);
 
                /*
@@ -1653,12 +1653,12 @@ setup_collation(void)
                 * "en_US" for LATIN1, say.
                 */
                if (normalize_locale_name(alias, localebuf))
-                       PG_CMD_PRINTF3("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('%s', '%s', %d);",
+                       PG_CMD_PRINTF3("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('%s', '%s', %d);\n",
                                                   escape_quotes(alias), escape_quotes(localebuf), enc);
        }
 
        /* Add an SQL-standard name */
-       PG_CMD_PRINTF1("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('ucs_basic', 'C', %d);", PG_UTF8);
+       PG_CMD_PRINTF1("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('ucs_basic', 'C', %d);\n", PG_UTF8);
 
        /*
         * When copying collations to the final location, eliminate
@@ -1674,8 +1674,7 @@ setup_collation(void)
                                "   COALESCE(collname, locale) AS final_collname, "
                                "   (SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog') AS collnamespace, "
                                "   (SELECT relowner FROM pg_class WHERE relname = 'pg_collation') AS collowner, "
-                               "   encoding, "
-                               "   locale, locale "
+                               "   encoding, locale, locale "
                                "  FROM tmp_pg_collation"
                                "  ORDER BY final_collname, collnamespace, encoding, (collname = locale) DESC, locale;\n");
 
@@ -1683,12 +1682,9 @@ setup_collation(void)
        PG_CMD_CLOSE;
 
        check_ok();
-       if (skipped && !debug)
+       if (count == 0 && !debug)
        {
-               printf(ngettext("%d system locale has been omitted because it cannot supported by PostgreSQL.\n",
-                                               "%d system locales have been omitted because they cannot be supported by PostgreSQL.\n",
-                                               skipped),
-                          skipped);
+               printf(_("No usable system locales were found.\n"));
                printf(_("Use the option \"--debug\" to see details.\n"));
        }
 #else /* not HAVE_LOCALE_T */