aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/formatting.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-03-22 16:55:32 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-03-22 16:55:32 -0400
commit6e197cb2e537880f36828a6c55d0f6df5bf7daa8 (patch)
tree72cfdd5c6fbba12577a1c2df45c6ddf18c221905 /src/backend/utils/adt/formatting.c
parent37d6d07dda28a5dffcad6ff195ab2c83aaebcc9e (diff)
downloadpostgresql-6e197cb2e537880f36828a6c55d0f6df5bf7daa8.tar.gz
postgresql-6e197cb2e537880f36828a6c55d0f6df5bf7daa8.zip
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.
Diffstat (limited to 'src/backend/utils/adt/formatting.c')
-rw-r--r--src/backend/utils/adt/formatting.c78
1 files changed, 78 insertions, 0 deletions
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);