Dept of second thoughts: don't use the new wide-character upper/lower
authorTom Lane
Sun, 6 Jun 2004 22:17:01 +0000 (22:17 +0000)
committerTom Lane
Sun, 6 Jun 2004 22:17:01 +0000 (22:17 +0000)
code if we are running in a single-byte encoding.  No point in the
extra overhead in that case.

src/backend/utils/adt/oracle_compat.c

index ddbe890dd544c44a09bec5a18077fa563d94aacf..18a0e9e804244fc1e0e20685c0b0db6c892141fa 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.52 2004/05/26 16:16:03 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/oracle_compat.c,v 1.53 2004/06/06 22:17:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -166,40 +166,44 @@ Datum
 lower(PG_FUNCTION_ARGS)
 {
 #ifdef USE_WIDE_UPPER_LOWER
-   text       *string = PG_GETARG_TEXT_P(0);
-   text       *result;
-   wchar_t    *workspace;
-   int         i;
-
-   workspace = texttowcs(string);
+   /* use wide char code only when max encoding length > one */
+   if (pg_database_encoding_max_length() > 1)
+   {
+       text       *string = PG_GETARG_TEXT_P(0);
+       text       *result;
+       wchar_t    *workspace;
+       int         i;
 
-   for (i = 0; workspace[i] != 0; i++)
-       workspace[i] = towlower(workspace[i]);
+       workspace = texttowcs(string);
 
-   result = wcstotext(workspace, i);
+       for (i = 0; workspace[i] != 0; i++)
+           workspace[i] = towlower(workspace[i]);
 
-   pfree(workspace);
+       result = wcstotext(workspace, i);
 
-   PG_RETURN_TEXT_P(result);
+       pfree(workspace);
 
-#else /* !USE_WIDE_UPPER_LOWER */
+       PG_RETURN_TEXT_P(result);
+   }
+   else
+#endif /* USE_WIDE_UPPER_LOWER */
+   {
+       text       *string = PG_GETARG_TEXT_P_COPY(0);
+       char       *ptr;
+       int         m;
 
-   text       *string = PG_GETARG_TEXT_P_COPY(0);
-   char       *ptr;
-   int         m;
+       /* Since we copied the string, we can scribble directly on the value */
+       ptr = VARDATA(string);
+       m = VARSIZE(string) - VARHDRSZ;
 
-   /* Since we copied the string, we can scribble directly on the value */
-   ptr = VARDATA(string);
-   m = VARSIZE(string) - VARHDRSZ;
+       while (m-- > 0)
+       {
+           *ptr = tolower((unsigned char) *ptr);
+           ptr++;
+       }
 
-   while (m-- > 0)
-   {
-       *ptr = tolower((unsigned char) *ptr);
-       ptr++;
+       PG_RETURN_TEXT_P(string);
    }
-
-   PG_RETURN_TEXT_P(string);
-#endif /* USE_WIDE_UPPER_LOWER */
 }
 
 
@@ -221,40 +225,44 @@ Datum
 upper(PG_FUNCTION_ARGS)
 {
 #ifdef USE_WIDE_UPPER_LOWER
-   text       *string = PG_GETARG_TEXT_P(0);
-   text       *result;
-   wchar_t    *workspace;
-   int         i;
-
-   workspace = texttowcs(string);
+   /* use wide char code only when max encoding length > one */
+   if (pg_database_encoding_max_length() > 1)
+   {
+       text       *string = PG_GETARG_TEXT_P(0);
+       text       *result;
+       wchar_t    *workspace;
+       int         i;
 
-   for (i = 0; workspace[i] != 0; i++)
-       workspace[i] = towupper(workspace[i]);
+       workspace = texttowcs(string);
 
-   result = wcstotext(workspace, i);
+       for (i = 0; workspace[i] != 0; i++)
+           workspace[i] = towupper(workspace[i]);
 
-   pfree(workspace);
+       result = wcstotext(workspace, i);
 
-   PG_RETURN_TEXT_P(result);
+       pfree(workspace);
 
-#else /* !USE_WIDE_UPPER_LOWER */
+       PG_RETURN_TEXT_P(result);
+   }
+   else
+#endif /* USE_WIDE_UPPER_LOWER */
+   {
+       text       *string = PG_GETARG_TEXT_P_COPY(0);
+       char       *ptr;
+       int         m;
 
-   text       *string = PG_GETARG_TEXT_P_COPY(0);
-   char       *ptr;
-   int         m;
+       /* Since we copied the string, we can scribble directly on the value */
+       ptr = VARDATA(string);
+       m = VARSIZE(string) - VARHDRSZ;
 
-   /* Since we copied the string, we can scribble directly on the value */
-   ptr = VARDATA(string);
-   m = VARSIZE(string) - VARHDRSZ;
+       while (m-- > 0)
+       {
+           *ptr = toupper((unsigned char) *ptr);
+           ptr++;
+       }
 
-   while (m-- > 0)
-   {
-       *ptr = toupper((unsigned char) *ptr);
-       ptr++;
+       PG_RETURN_TEXT_P(string);
    }
-
-   PG_RETURN_TEXT_P(string);
-#endif /* USE_WIDE_UPPER_LOWER */
 }
 
 
@@ -279,58 +287,56 @@ Datum
 initcap(PG_FUNCTION_ARGS)
 {
 #ifdef USE_WIDE_UPPER_LOWER
-   text       *string = PG_GETARG_TEXT_P(0);
-   text       *result;
-   wchar_t    *workspace;
-   int         wasalnum = 0;
-   int         i;
-
-   workspace = texttowcs(string);
-
-   for (i = 0; workspace[i] != 0; i++)
+   /* use wide char code only when max encoding length > one */
+   if (pg_database_encoding_max_length() > 1)
    {
-       if (wasalnum)
-           workspace[i] = towlower(workspace[i]);
-       else
-           workspace[i] = towupper(workspace[i]);
-       wasalnum = iswalnum(workspace[i]);
-   }
+       text       *string = PG_GETARG_TEXT_P(0);
+       text       *result;
+       wchar_t    *workspace;
+       int         wasalnum = 0;
+       int         i;
 
-   result = wcstotext(workspace, i);
+       workspace = texttowcs(string);
 
-   pfree(workspace);
+       for (i = 0; workspace[i] != 0; i++)
+       {
+           if (wasalnum)
+               workspace[i] = towlower(workspace[i]);
+           else
+               workspace[i] = towupper(workspace[i]);
+           wasalnum = iswalnum(workspace[i]);
+       }
 
-   PG_RETURN_TEXT_P(result);
+       result = wcstotext(workspace, i);
 
-#else /* !USE_WIDE_UPPER_LOWER */
+       pfree(workspace);
 
-   text       *string = PG_GETARG_TEXT_P_COPY(0);
-   char       *ptr;
-   int         m;
+       PG_RETURN_TEXT_P(result);
+   }
+   else
+#endif /* USE_WIDE_UPPER_LOWER */
+   {
+       text       *string = PG_GETARG_TEXT_P_COPY(0);
+       int         wasalnum = 0;
+       char       *ptr;
+       int         m;
 
-   /* Since we copied the string, we can scribble directly on the value */
-   ptr = VARDATA(string);
-   m = VARSIZE(string) - VARHDRSZ;
+       /* Since we copied the string, we can scribble directly on the value */
+       ptr = VARDATA(string);
+       m = VARSIZE(string) - VARHDRSZ;
 
-   if (m > 0)
-   {
-       *ptr = toupper((unsigned char) *ptr);
-       ptr++;
-       m--;
-   }
+       while (m-- > 0)
+       {
+           if (wasalnum)
+               *ptr = tolower((unsigned char) *ptr);
+           else
+               *ptr = toupper((unsigned char) *ptr);
+           wasalnum = isalnum((unsigned char) *ptr);
+           ptr++;
+       }
 
-   while (m-- > 0)
-   {
-       /* Oracle capitalizes after all non-alphanumeric */
-       if (!isalnum((unsigned char) ptr[-1]))
-           *ptr = toupper((unsigned char) *ptr);
-       else
-           *ptr = tolower((unsigned char) *ptr);
-       ptr++;
+       PG_RETURN_TEXT_P(string);
    }
-
-   PG_RETURN_TEXT_P(string);
-#endif /* USE_WIDE_UPPER_LOWER */
 }