diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 12419fc8df..9500c6b39f 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1227,13 +1227,18 @@ lc_ctype_is_c(Oid collation) static void report_newlocale_failure(const char *localename) { - /* copy errno in case one of the ereport auxiliary functions changes it */ - int save_errno = errno; + int save_errno; + + /* On Windows, transform _create_locale() error to errno */ +#ifdef WIN32 + _dosmaperr(GetLastError()); +#endif /* * ENOENT means "no such locale", not "no such file", so clarify that * errno with an errdetail message. */ + save_errno = errno; /* auxiliary funcs might change errno */ ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not create locale \"%s\": %m", diff --git a/src/test/regress/expected/collate.out b/src/test/regress/expected/collate.out index b0025c0a87..70866df000 100644 --- a/src/test/regress/expected/collate.out +++ b/src/test/regress/expected/collate.out @@ -627,6 +627,9 @@ CREATE COLLATION mycoll1 FROM "C"; CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" ); CREATE COLLATION mycoll3 FROM "default"; -- intentionally unsupported ERROR: collation "default" cannot be copied +CREATE COLLATION mycoll4 ( LOCALE = "no_such_locale" ); -- fail +ERROR: could not create locale "no_such_locale": No such file or directory +DETAIL: The operating system could not find any locale data for the locale name "no_such_locale". DROP COLLATION mycoll1; CREATE TABLE collate_test23 (f1 text collate mycoll2); DROP COLLATION mycoll2; -- fail diff --git a/src/test/regress/sql/collate.sql b/src/test/regress/sql/collate.sql index 698f577490..f095ae08be 100644 --- a/src/test/regress/sql/collate.sql +++ b/src/test/regress/sql/collate.sql @@ -234,6 +234,7 @@ EXPLAIN (COSTS OFF) CREATE COLLATION mycoll1 FROM "C"; CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" ); CREATE COLLATION mycoll3 FROM "default"; -- intentionally unsupported +CREATE COLLATION mycoll4 ( LOCALE = "no_such_locale" ); -- fail DROP COLLATION mycoll1; CREATE TABLE collate_test23 (f1 text collate mycoll2);