Commit 494f30c9 authored by Bruce Momjian's avatar Bruce Momjian

Prevent locale-aware handling of upper, lower, and initcap when the

locale is C.

Backpatch to 8.0.X because some operating systems were throwing errors
for such operations, rather than ignoring the locale when it was C.
parent 963ffe4c
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.57 2004/12/31 22:01:22 pgsql Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.58 2005/03/16 00:02:48 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -166,8 +166,8 @@ Datum ...@@ -166,8 +166,8 @@ Datum
lower(PG_FUNCTION_ARGS) lower(PG_FUNCTION_ARGS)
{ {
#ifdef USE_WIDE_UPPER_LOWER #ifdef USE_WIDE_UPPER_LOWER
/* use wide char code only when max encoding length > one */ /* use wide char code only when max encoding length > 1 and ctype != C */
if (pg_database_encoding_max_length() > 1) if (pg_database_encoding_max_length() > 1 && !lc_ctype_is_c())
{ {
text *string = PG_GETARG_TEXT_P(0); text *string = PG_GETARG_TEXT_P(0);
text *result; text *result;
...@@ -228,8 +228,8 @@ Datum ...@@ -228,8 +228,8 @@ Datum
upper(PG_FUNCTION_ARGS) upper(PG_FUNCTION_ARGS)
{ {
#ifdef USE_WIDE_UPPER_LOWER #ifdef USE_WIDE_UPPER_LOWER
/* use wide char code only when max encoding length > one */ /* use wide char code only when max encoding length > 1 and ctype != C */
if (pg_database_encoding_max_length() > 1) if (pg_database_encoding_max_length() > 1 && !lc_ctype_is_c())
{ {
text *string = PG_GETARG_TEXT_P(0); text *string = PG_GETARG_TEXT_P(0);
text *result; text *result;
...@@ -293,8 +293,8 @@ Datum ...@@ -293,8 +293,8 @@ Datum
initcap(PG_FUNCTION_ARGS) initcap(PG_FUNCTION_ARGS)
{ {
#ifdef USE_WIDE_UPPER_LOWER #ifdef USE_WIDE_UPPER_LOWER
/* use wide char code only when max encoding length > one */ /* use wide char code only when max encoding length > 1 and ctype != C */
if (pg_database_encoding_max_length() > 1) if (pg_database_encoding_max_length() > 1 && !lc_ctype_is_c())
{ {
text *string = PG_GETARG_TEXT_P(0); text *string = PG_GETARG_TEXT_P(0);
text *result; text *result;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* *
* Portions Copyright (c) 2002-2005, PostgreSQL Global Development Group * Portions Copyright (c) 2002-2005, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/backend/utils/adt/pg_locale.c,v 1.30 2005/01/01 05:43:07 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/pg_locale.c,v 1.31 2005/03/16 00:02:49 momjian Exp $
* *
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
*/ */
...@@ -196,6 +196,33 @@ lc_collate_is_c(void) ...@@ -196,6 +196,33 @@ lc_collate_is_c(void)
} }
/*
* We'd like to cache whether LC_CTYPE is C (or POSIX), so we can
* optimize a few code paths in various places.
*/
bool
lc_ctype_is_c(void)
{
/* Cache result so we only have to compute it once */
static int result = -1;
char *localeptr;
if (result >= 0)
return (bool) result;
localeptr = setlocale(LC_CTYPE, NULL);
if (!localeptr)
elog(ERROR, "invalid LC_CTYPE setting");
if (strcmp(localeptr, "C") == 0)
result = true;
else if (strcmp(localeptr, "POSIX") == 0)
result = true;
else
result = false;
return (bool) result;
}
/* /*
* Frees the malloced content of a struct lconv. (But not the struct * Frees the malloced content of a struct lconv. (But not the struct
* itself.) * itself.)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* PostgreSQL locale utilities * PostgreSQL locale utilities
* *
* $PostgreSQL: pgsql/src/include/utils/pg_locale.h,v 1.19 2005/01/01 05:43:09 momjian Exp $ * $PostgreSQL: pgsql/src/include/utils/pg_locale.h,v 1.20 2005/03/16 00:02:49 momjian Exp $
* *
* Copyright (c) 2002-2005, PostgreSQL Global Development Group * Copyright (c) 2002-2005, PostgreSQL Global Development Group
* *
...@@ -32,6 +32,7 @@ extern const char *locale_time_assign(const char *value, ...@@ -32,6 +32,7 @@ extern const char *locale_time_assign(const char *value,
bool doit, GucSource source); bool doit, GucSource source);
extern bool lc_collate_is_c(void); extern bool lc_collate_is_c(void);
extern bool lc_ctype_is_c(void);
/* /*
* Return the POSIX lconv struct (contains number/money formatting * Return the POSIX lconv struct (contains number/money formatting
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment