File not found error on creating collation

Started by Thom Brownover 14 years ago11 messages
#1Thom Brown
thom@linux.com

Hi,

I don't find the following error message very helpful:

=# create collation "sr_SP" (LOCALE ='sr_SB.utf8');

ERROR: could not create locale "sr_SB.utf8": No such file or directory

It's correct in that it shouldn't be able to create the locale since
it's not installed, but what file can't it find? What is the user
supposed to do with this message?

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#2Marti Raudsepp
marti@juffo.org
In reply to: Thom Brown (#1)
Re: File not found error on creating collation

On Tue, Sep 20, 2011 at 03:24, Thom Brown <thom@linux.com> wrote:

ERROR:  could not create locale "sr_SB.utf8": No such file or directory

It's correct in that it shouldn't be able to create the locale since
it's not installed, but what file can't it find?  What is the user
supposed to do with this message?

Unfortunately locales are OS-specific so there's not much universal
advice that Postgres could give. However, I guess it does make sense
addressing this in documentation.

On Linux you'd need to edit the /etc/locale.gen file and then run
'locale-gen' as root.

Regards,
Marti

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Marti Raudsepp (#2)
Re: File not found error on creating collation

Marti Raudsepp <marti@juffo.org> writes:

On Tue, Sep 20, 2011 at 03:24, Thom Brown <thom@linux.com> wrote:

ERROR:  could not create locale "sr_SB.utf8": No such file or directory
It's correct in that it shouldn't be able to create the locale since
it's not installed, but what file can't it find?  What is the user
supposed to do with this message?

Unfortunately locales are OS-specific so there's not much universal
advice that Postgres could give.

The reason it's doing that is that newlocale() is returning ENOENT,
which is what it's supposed to do according to the standard:

ERRORS

The newlocale() function shall fail if:

[ENOMEM]
There is not enough memory available to create the locale object or load the locale data.
[EINVAL]
The category_mask contains a bit that does not correspond to a valid category.
[ENOENT]
For any of the categories in category_mask, the locale data is not available.

The generic meaning of ENOENT is "file not found", and at some level
this probably *is* a file-not-found situation, but Postgres has no way
to know which file is missing.

We could possibly add a HINT suggesting that the locale isn't installed,
but I don't see that we could offer any useful generic advice about how
to install it. I'm also worried about how to phrase the hint to cover
some other obvious possibilities, like "you fat-fingered the locale
name".

regards, tom lane

#4Robert Haas
robertmhaas@gmail.com
In reply to: Tom Lane (#3)
Re: File not found error on creating collation

On Mon, Sep 19, 2011 at 10:04 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Marti Raudsepp <marti@juffo.org> writes:

On Tue, Sep 20, 2011 at 03:24, Thom Brown <thom@linux.com> wrote:

ERROR:  could not create locale "sr_SB.utf8": No such file or directory
It's correct in that it shouldn't be able to create the locale since
it's not installed, but what file can't it find?  What is the user
supposed to do with this message?

Unfortunately locales are OS-specific so there's not much universal
advice that Postgres could give.

The reason it's doing that is that newlocale() is returning ENOENT,
which is what it's supposed to do according to the standard:

       ERRORS

       The newlocale() function shall fail if:

       [ENOMEM]
       There is not enough memory available to create the locale object or load the locale data.
       [EINVAL]
       The category_mask contains a bit that does not correspond to a valid category.
       [ENOENT]
       For any of the categories in category_mask, the locale data is not available.

The generic meaning of ENOENT is "file not found", and at some level
this probably *is* a file-not-found situation, but Postgres has no way
to know which file is missing.

We could possibly add a HINT suggesting that the locale isn't installed,
but I don't see that we could offer any useful generic advice about how
to install it.  I'm also worried about how to phrase the hint to cover
some other obvious possibilities, like "you fat-fingered the locale
name".

Maybe something like this?

HINT: The operating system was unable to find any locale data for the
locale name you specified.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert Haas (#4)
Re: File not found error on creating collation

Robert Haas <robertmhaas@gmail.com> writes:

On Mon, Sep 19, 2011 at 10:04 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

We could possibly add a HINT suggesting that the locale isn't installed,
but I don't see that we could offer any useful generic advice about how
to install it. I'm also worried about how to phrase the hint to cover
some other obvious possibilities, like "you fat-fingered the locale
name".

Maybe something like this?

HINT: The operating system was unable to find any locale data for the
locale name you specified.

Hmm, that's not bad. We could probably even call it errdetail, since
it's not so much a hint as explaining what the SUS spec states that the
ENOENT error code means here.

In the nitpick department, s/was unable to/could not/ per our usual
message style guidelines. Otherwise seems good.

regards, tom lane

#6Thom Brown
thom@linux.com
In reply to: Tom Lane (#5)
Re: File not found error on creating collation

On 20 September 2011 05:20, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Robert Haas <robertmhaas@gmail.com> writes:

On Mon, Sep 19, 2011 at 10:04 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

We could possibly add a HINT suggesting that the locale isn't installed,
but I don't see that we could offer any useful generic advice about how
to install it.  I'm also worried about how to phrase the hint to cover
some other obvious possibilities, like "you fat-fingered the locale
name".

Maybe something like this?

HINT: The operating system was unable to find any locale data for the
locale name you specified.

Hmm, that's not bad.  We could probably even call it errdetail, since
it's not so much a hint as explaining what the SUS spec states that the
ENOENT error code means here.

In the nitpick department, s/was unable to/could not/ per our usual
message style guidelines.  Otherwise seems good.

Sounds good to me. If this is to be the errdetail, does that mean
you'd be keeping the original message in tact? The problem with the
actual error message is that it might cause the user to think along
the lines of "Am I supposed to put a fully qualified path in this
parameter?".

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Thom Brown (#6)
Re: File not found error on creating collation

Thom Brown <thom@linux.com> writes:

On 20 September 2011 05:20, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Robert Haas <robertmhaas@gmail.com> writes:

Maybe something like this?
HINT: The operating system was unable to find any locale data for the
locale name you specified.

Hmm, that's not bad. We could probably even call it errdetail, since
it's not so much a hint as explaining what the SUS spec states that the
ENOENT error code means here.

Sounds good to me. If this is to be the errdetail, does that mean
you'd be keeping the original message in tact? The problem with the
actual error message is that it might cause the user to think along
the lines of "Am I supposed to put a fully qualified path in this
parameter?".

[ shrug... ] And who's to say that that's wrong? We have no knowledge
of the OS's conventions for naming locales. There's a limit to how
friendly we can make this message without turning it into something
that's actively misleading for platforms we failed to consider.

regards, tom lane

#8Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#7)
Re: File not found error on creating collation

Thom Brown <thom@linux.com> writes:

[ unhelpful reporting of ENOENT from newlocale() ]

BTW, on examining the code I note that we're doing something else that
promotes the confusion of "bad locale name" with "bad file name": we're
using errcode_for_file_access() to select the SQLSTATE. If we don't
believe that ENOENT should be taken at face value then this is pointless
(none of the other spec-defined error codes for newlocale() are
particularly sensible as file access errors). I propose just reporting
ERRCODE_INVALID_PARAMETER_VALUE instead.

regards, tom lane

#9Thom Brown
thom@linux.com
In reply to: Tom Lane (#8)
Re: File not found error on creating collation

On 20 September 2011 17:45, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Thom Brown <thom@linux.com> writes:

[ unhelpful reporting of ENOENT from newlocale() ]

BTW, on examining the code I note that we're doing something else that
promotes the confusion of "bad locale name" with "bad file name": we're
using errcode_for_file_access() to select the SQLSTATE.  If we don't
believe that ENOENT should be taken at face value then this is pointless
(none of the other spec-defined error codes for newlocale() are
particularly sensible as file access errors).  I propose just reporting
ERRCODE_INVALID_PARAMETER_VALUE instead.

*nods*

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Thom Brown (#9)
Re: File not found error on creating collation

Thom Brown <thom@linux.com> writes:

On 20 September 2011 17:45, Tom Lane <tgl@sss.pgh.pa.us> wrote:

BTW, on examining the code I note that we're doing something else that
promotes the confusion of "bad locale name" with "bad file name": we're
using errcode_for_file_access() to select the SQLSTATE. �If we don't
believe that ENOENT should be taken at face value then this is pointless
(none of the other spec-defined error codes for newlocale() are
particularly sensible as file access errors). �I propose just reporting
ERRCODE_INVALID_PARAMETER_VALUE instead.

*nods*

OK, done.

regards, tom lane

#11Thom Brown
thom@linux.com
In reply to: Tom Lane (#10)
Re: File not found error on creating collation

On 20 September 2011 18:25, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Thom Brown <thom@linux.com> writes:

On 20 September 2011 17:45, Tom Lane <tgl@sss.pgh.pa.us> wrote:

BTW, on examining the code I note that we're doing something else that
promotes the confusion of "bad locale name" with "bad file name": we're
using errcode_for_file_access() to select the SQLSTATE.  If we don't
believe that ENOENT should be taken at face value then this is pointless
(none of the other spec-defined error codes for newlocale() are
particularly sensible as file access errors).  I propose just reporting
ERRCODE_INVALID_PARAMETER_VALUE instead.

*nods*

OK, done.

Thanks.

--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company