From 6e197cb2e537880f36828a6c55d0f6df5bf7daa8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 22 Mar 2011 16:55:32 -0400 Subject: Improve reporting of run-time-detected indeterminate-collation errors. pg_newlocale_from_collation does not have enough context to give an error message that's even a little bit useful, so move the responsibility for complaining up to its callers. Also, reword ERRCODE_INDETERMINATE_COLLATION error messages in a less jargony, more message-style-guide-compliant fashion. --- src/backend/utils/adt/formatting.c | 78 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) (limited to 'src/backend/utils/adt/formatting.c') diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 54783103a2c..45e36f92e50 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1503,7 +1503,20 @@ str_tolower(const char *buff, size_t nbytes, Oid collid) size_t result_size; if (collid != DEFAULT_COLLATION_OID) + { + if (!OidIsValid(collid)) + { + /* + * This typically means that the parser could not resolve a + * conflict of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for lower() function"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } mylocale = pg_newlocale_from_collation(collid); + } /* Overflow paranoia */ if ((nbytes + 1) > (INT_MAX / sizeof(wchar_t))) @@ -1540,7 +1553,20 @@ str_tolower(const char *buff, size_t nbytes, Oid collid) char *p; if (collid != DEFAULT_COLLATION_OID) + { + if (!OidIsValid(collid)) + { + /* + * This typically means that the parser could not resolve a + * conflict of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for lower() function"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } mylocale = pg_newlocale_from_collation(collid); + } result = pnstrdup(buff, nbytes); @@ -1598,7 +1624,20 @@ str_toupper(const char *buff, size_t nbytes, Oid collid) size_t result_size; if (collid != DEFAULT_COLLATION_OID) + { + if (!OidIsValid(collid)) + { + /* + * This typically means that the parser could not resolve a + * conflict of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for upper() function"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } mylocale = pg_newlocale_from_collation(collid); + } /* Overflow paranoia */ if ((nbytes + 1) > (INT_MAX / sizeof(wchar_t))) @@ -1635,7 +1674,20 @@ str_toupper(const char *buff, size_t nbytes, Oid collid) char *p; if (collid != DEFAULT_COLLATION_OID) + { + if (!OidIsValid(collid)) + { + /* + * This typically means that the parser could not resolve a + * conflict of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for upper() function"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } mylocale = pg_newlocale_from_collation(collid); + } result = pnstrdup(buff, nbytes); @@ -1705,7 +1757,20 @@ str_initcap(const char *buff, size_t nbytes, Oid collid) size_t result_size; if (collid != DEFAULT_COLLATION_OID) + { + if (!OidIsValid(collid)) + { + /* + * This typically means that the parser could not resolve a + * conflict of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for initcap() function"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } mylocale = pg_newlocale_from_collation(collid); + } /* Overflow paranoia */ if ((nbytes + 1) > (INT_MAX / sizeof(wchar_t))) @@ -1754,7 +1819,20 @@ str_initcap(const char *buff, size_t nbytes, Oid collid) char *p; if (collid != DEFAULT_COLLATION_OID) + { + if (!OidIsValid(collid)) + { + /* + * This typically means that the parser could not resolve a + * conflict of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for initcap() function"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } mylocale = pg_newlocale_from_collation(collid); + } result = pnstrdup(buff, nbytes); -- cgit v1.2.3