Thread: Fix doc for initcap

Fix doc for initcap

From
Dennis Bjorklund
Date:
Here is a small doc patch that says that initcap lowercases the rest of
the characters in the string. The current doc suggests that it only
touches the first character in each word, which is not what the function
does.

Maybe we should change the example to be 'hi THOMAS' instead of 'hi
thomas'.

Is it okay for me to commit this?

--
/Dennis Björklund

Attachment

Re: Fix doc for initcap

From
Neil Conway
Date:
Dennis Bjorklund <db@zigo.dhs.org> writes:
> Here is a small doc patch that says that initcap lowercases the rest
> of the characters in the string. The current doc suggests that it
> only touches the first character in each word, which is not what the
> function does.

The improved text is still wrong: initcap() no longer uses whitespace
to separate words. I've applied the attached patch to CVS HEAD, which
fixes this properly and makes some other doc cleanups.

Thanks for the patch!

-Neil
Index: doc/src/sgml/func.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/func.sgml,v
retrieving revision 1.187
diff -c -r1.187 func.sgml
*** a/doc/src/sgml/func.sgml    22 Feb 2004 04:14:06 -0000    1.187
--- b/doc/src/sgml/func.sgml    27 Feb 2004 03:47:17 -0000
***************
*** 1003,1009 ****
        <row>
         <entry><literal><function>upper</function>(<parameter>string</parameter>)</literal></entry>
         <entry><type>text</type></entry>
!        <entry>Convert string to upper case</entry>
         <entry><literal>upper('tom')</literal></entry>
         <entry><literal>TOM</literal></entry>
        </row>
--- 1003,1009 ----
        <row>
         <entry><literal><function>upper</function>(<parameter>string</parameter>)</literal></entry>
         <entry><type>text</type></entry>
!        <entry>Convert string to uppercase</entry>
         <entry><literal>upper('tom')</literal></entry>
         <entry><literal>TOM</literal></entry>
        </row>
***************
*** 1033,1039 ****
       <tbody>
        <row>
         <entry><literal><function>ascii</function>(<type>text</type>)</literal></entry>
!        <entry>integer</entry>
         <entry><acronym>ASCII</acronym> code of the first character of the argument</entry>
         <entry><literal>ascii('x')</literal></entry>
         <entry><literal>120</literal></entry>
--- 1033,1039 ----
       <tbody>
        <row>
         <entry><literal><function>ascii</function>(<type>text</type>)</literal></entry>
!        <entry><type>integer</type></entry>
         <entry><acronym>ASCII</acronym> code of the first character of the argument</entry>
         <entry><literal>ascii('x')</literal></entry>
         <entry><literal>120</literal></entry>
***************
*** 1109,1124 ****
        <row>
         <entry><literal><function>initcap</function>(<type>text</type>)</literal></entry>
         <entry><type>text</type></entry>
!        <entry>Convert first letter of each word (whitespace-separated) to upper case</entry>
!        <entry><literal>initcap('hi thomas')</literal></entry>
         <entry><literal>Hi Thomas</literal></entry>
        </row>

        <row>
!        <entry><literal><function>length</function>(<parameter>string</parameter>)</literal></entry>
         <entry><type>integer</type></entry>
         <entry>
!         Number of characters in string
          <indexterm>
           <primary>character string</primary>
           <secondary>length</secondary>
--- 1109,1128 ----
        <row>
         <entry><literal><function>initcap</function>(<type>text</type>)</literal></entry>
         <entry><type>text</type></entry>
!        <entry>
!         Convert the first letter of each word to uppercase and the
!         rest to lowercase. Words are sequences of alphanumeric
!         characters separated by non-alphanumeric characters.
!        </entry>
!        <entry><literal>initcap('hi THOMAS')</literal></entry>
         <entry><literal>Hi Thomas</literal></entry>
        </row>

        <row>
!        <entry><literal><function>length</function>(<parameter>string</parameter> <type>text</type>)</literal></entry>
         <entry><type>integer</type></entry>
         <entry>
!         Number of characters in <parameter>string</parameter>.
          <indexterm>
           <primary>character string</primary>
           <secondary>length</secondary>
***************
*** 1139,1145 ****
          <parameter>length</parameter> <type>integer</type>
          <optional>, <parameter>fill</parameter> <type>text</type></optional>)</literal>
         </entry>
!        <entry>text</entry>
         <entry>
          Fill up the <parameter>string</parameter> to length
          <parameter>length</parameter> by prepending the characters
--- 1143,1149 ----
          <parameter>length</parameter> <type>integer</type>
          <optional>, <parameter>fill</parameter> <type>text</type></optional>)</literal>
         </entry>
!        <entry><type>text</type></entry>
         <entry>
          Fill up the <parameter>string</parameter> to length
          <parameter>length</parameter> by prepending the characters
***************
*** 1157,1163 ****
         <entry><type>text</type></entry>
         <entry>
          Remove the longest string containing only characters from
!         <parameter>characters</parameter> from the start of the string.
         </entry>
         <entry><literal>ltrim('zzzytrim', 'xyz')</literal></entry>
         <entry><literal>trim</literal></entry>
--- 1161,1168 ----
         <entry><type>text</type></entry>
         <entry>
          Remove the longest string containing only characters from
!         <parameter>characters</parameter> from the start of
!         <parameter>string</parameter>.
         </entry>
         <entry><literal>ltrim('zzzytrim', 'xyz')</literal></entry>
         <entry><literal>trim</literal></entry>
***************
*** 1167,1173 ****
         <entry><literal><function>md5</function>(<parameter>string</parameter> <type>text</type>)</literal></entry>
         <entry><type>text</type></entry>
         <entry>
!         Calculates the MD5 hash of given string, returning the result in hexadecimal.
         </entry>
         <entry><literal>md5('abc')</literal></entry>
         <entry><literal>900150983cd24fb0 d6963f7d28e17f72</literal></entry>
--- 1172,1179 ----
         <entry><literal><function>md5</function>(<parameter>string</parameter> <type>text</type>)</literal></entry>
         <entry><type>text</type></entry>
         <entry>
!         Calculates the MD5 hash of <parameter>string</parameter>,
!         returning the result in hexadecimal.
         </entry>
         <entry><literal>md5('abc')</literal></entry>
         <entry><literal>900150983cd24fb0 d6963f7d28e17f72</literal></entry>
***************
*** 1210,1218 ****
        </row>

        <row>
!        <entry><literal><function>repeat</function>(<type>text</type>, <type>integer</type>)</literal></entry>
         <entry><type>text</type></entry>
!        <entry>Repeat text a number of times</entry>
         <entry><literal>repeat('Pg', 4)</literal></entry>
         <entry><literal>PgPgPgPg</literal></entry>
        </row>
--- 1216,1225 ----
        </row>

        <row>
!        <entry><literal><function>repeat</function>(<parameter>string</parameter> <type>text</type>,
<parameter>number</parameter><type>integer</type>)</literal></entry> 
         <entry><type>text</type></entry>
!        <entry>Repeat <parameter>string</parameter> the specified
!        <parameter>number</parameter> of times</entry>
         <entry><literal>repeat('Pg', 4)</literal></entry>
         <entry><literal>PgPgPgPg</literal></entry>
        </row>
***************
*** 1253,1259 ****
         <entry><type>text</type></entry>
         <entry>
          Remove the longest string containing only characters from
!         <parameter>characters</parameter> from the end of the string.
         </entry>
         <entry><literal>rtrim('trimxxxx', 'x')</literal></entry>
         <entry><literal>trim</literal></entry>
--- 1260,1267 ----
         <entry><type>text</type></entry>
         <entry>
          Remove the longest string containing only characters from
!         <parameter>characters</parameter> from the end of
!         <parameter>string</parameter>.
         </entry>
         <entry><literal>rtrim('trimxxxx', 'x')</literal></entry>
         <entry><literal>trim</literal></entry>
***************
*** 3956,3967 ****
         <row>
      <entry><literal>AM</literal> or <literal>A.M.</literal> or
      <literal>PM</literal> or <literal>P.M.</literal></entry>
!     <entry>meridian indicator (upper case)</entry>
         </row>
         <row>
      <entry><literal>am</literal> or <literal>a.m.</literal> or
      <literal>pm</literal> or <literal>p.m.</literal></entry>
!     <entry>meridian indicator (lower case)</entry>
         </row>
         <row>
      <entry><literal>Y,YYY</literal></entry>
--- 3964,3975 ----
         <row>
      <entry><literal>AM</literal> or <literal>A.M.</literal> or
      <literal>PM</literal> or <literal>P.M.</literal></entry>
!     <entry>meridian indicator (uppercase)</entry>
         </row>
         <row>
      <entry><literal>am</literal> or <literal>a.m.</literal> or
      <literal>pm</literal> or <literal>p.m.</literal></entry>
!     <entry>meridian indicator (lowercase)</entry>
         </row>
         <row>
      <entry><literal>Y,YYY</literal></entry>
***************
*** 4002,4017 ****
         <row>
      <entry><literal>BC</literal> or <literal>B.C.</literal> or
      <literal>AD</literal> or <literal>A.D.</literal></entry>
!     <entry>era indicator (upper case)</entry>
         </row>
         <row>
      <entry><literal>bc</literal> or <literal>b.c.</literal> or
      <literal>ad</literal> or <literal>a.d.</literal></entry>
!     <entry>era indicator (lower case)</entry>
         </row>
         <row>
      <entry><literal>MONTH</literal></entry>
!     <entry>full upper-case month name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>Month</literal></entry>
--- 4010,4025 ----
         <row>
      <entry><literal>BC</literal> or <literal>B.C.</literal> or
      <literal>AD</literal> or <literal>A.D.</literal></entry>
!     <entry>era indicator (uppercase)</entry>
         </row>
         <row>
      <entry><literal>bc</literal> or <literal>b.c.</literal> or
      <literal>ad</literal> or <literal>a.d.</literal></entry>
!     <entry>era indicator (lowercase)</entry>
         </row>
         <row>
      <entry><literal>MONTH</literal></entry>
!     <entry>full uppercase month name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>Month</literal></entry>
***************
*** 4019,4029 ****
         </row>
         <row>
      <entry><literal>month</literal></entry>
!     <entry>full lower-case month name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>MON</literal></entry>
!     <entry>abbreviated upper-case month name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>Mon</literal></entry>
--- 4027,4037 ----
         </row>
         <row>
      <entry><literal>month</literal></entry>
!     <entry>full lowercase month name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>MON</literal></entry>
!     <entry>abbreviated uppercase month name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>Mon</literal></entry>
***************
*** 4031,4037 ****
         </row>
         <row>
      <entry><literal>mon</literal></entry>
!     <entry>abbreviated lower-case month name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>MM</literal></entry>
--- 4039,4045 ----
         </row>
         <row>
      <entry><literal>mon</literal></entry>
!     <entry>abbreviated lowercase month name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>MM</literal></entry>
***************
*** 4039,4045 ****
         </row>
         <row>
      <entry><literal>DAY</literal></entry>
!     <entry>full upper-case day name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>Day</literal></entry>
--- 4047,4053 ----
         </row>
         <row>
      <entry><literal>DAY</literal></entry>
!     <entry>full uppercase day name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>Day</literal></entry>
***************
*** 4047,4057 ****
         </row>
         <row>
      <entry><literal>day</literal></entry>
!     <entry>full lower-case day name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>DY</literal></entry>
!     <entry>abbreviated upper-case day name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>Dy</literal></entry>
--- 4055,4065 ----
         </row>
         <row>
      <entry><literal>day</literal></entry>
!     <entry>full lowercase day name (blank-padded to 9 chars)</entry>
         </row>
         <row>
      <entry><literal>DY</literal></entry>
!     <entry>abbreviated uppercase day name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>Dy</literal></entry>
***************
*** 4059,4065 ****
         </row>
         <row>
      <entry><literal>dy</literal></entry>
!     <entry>abbreviated lower-case day name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>DDD</literal></entry>
--- 4067,4073 ----
         </row>
         <row>
      <entry><literal>dy</literal></entry>
!     <entry>abbreviated lowercase day name (3 chars)</entry>
         </row>
         <row>
      <entry><literal>DDD</literal></entry>
***************
*** 4099,4117 ****
         </row>
         <row>
      <entry><literal>RM</literal></entry>
!     <entry>month in Roman numerals (I-XII; I=January) (upper case)</entry>
         </row>
         <row>
      <entry><literal>rm</literal></entry>
!     <entry>month in Roman numerals (i-xii; i=January) (lower case)</entry>
         </row>
         <row>
      <entry><literal>TZ</literal></entry>
!     <entry>time-zone name (upper case)</entry>
         </row>
         <row>
      <entry><literal>tz</literal></entry>
!     <entry>time-zone name (lower case)</entry>
         </row>
        </tbody>
       </tgroup>
--- 4107,4125 ----
         </row>
         <row>
      <entry><literal>RM</literal></entry>
!     <entry>month in Roman numerals (I-XII; I=January) (uppercase)</entry>
         </row>
         <row>
      <entry><literal>rm</literal></entry>
!     <entry>month in Roman numerals (i-xii; i=January) (lowercase)</entry>
         </row>
         <row>
      <entry><literal>TZ</literal></entry>
!     <entry>time-zone name (uppercase)</entry>
         </row>
         <row>
      <entry><literal>tz</literal></entry>
!     <entry>time-zone name (lowercase)</entry>
         </row>
        </tbody>
       </tgroup>
***************
*** 4144,4155 ****
         </row>
         <row>
      <entry><literal>TH</literal> suffix</entry>
!     <entry>upper-case ordinal number suffix</entry>
      <entry><literal>DDTH</literal></entry>
         </row>
         <row>
      <entry><literal>th</literal> suffix</entry>
!     <entry>lower-case ordinal number suffix</entry>
      <entry><literal>DDth</literal></entry>
         </row>
         <row>
--- 4152,4163 ----
         </row>
         <row>
      <entry><literal>TH</literal> suffix</entry>
!     <entry>uppercase ordinal number suffix</entry>
      <entry><literal>DDTH</literal></entry>
         </row>
         <row>
      <entry><literal>th</literal> suffix</entry>
!     <entry>lowercase ordinal number suffix</entry>
      <entry><literal>DDth</literal></entry>
         </row>
         <row>
***************
*** 6216,6222 ****
     sequence-function call is specified by a text-string argument.  To
     achieve some compatibility with the handling of ordinary
     <acronym>SQL</acronym> names, the sequence functions convert their
!    argument to lower case unless the string is double-quoted.  Thus
  <programlisting>
  nextval('foo')      <lineannotation>operates on sequence <literal>foo</literal></>
  nextval('FOO')      <lineannotation>operates on sequence <literal>foo</literal></>
--- 6224,6230 ----
     sequence-function call is specified by a text-string argument.  To
     achieve some compatibility with the handling of ordinary
     <acronym>SQL</acronym> names, the sequence functions convert their
!    argument to lowercase unless the string is double-quoted.  Thus
  <programlisting>
  nextval('foo')      <lineannotation>operates on sequence <literal>foo</literal></>
  nextval('FOO')      <lineannotation>operates on sequence <literal>foo</literal></>
Index: doc/src/sgml/plpgsql.sgml
===================================================================
RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/plpgsql.sgml,v
retrieving revision 1.35
diff -c -r1.35 plpgsql.sgml
*** a/doc/src/sgml/plpgsql.sgml    3 Feb 2004 17:34:02 -0000    1.35
--- b/doc/src/sgml/plpgsql.sgml    27 Feb 2004 03:47:48 -0000
***************
*** 392,398 ****

      <para>
       All key words and identifiers can be written in mixed upper and
!      lower case.  Identifiers are implicitly converted to lower-case
       unless double-quoted.
      </para>

--- 392,398 ----

      <para>
       All key words and identifiers can be written in mixed upper and
!      lower case.  Identifiers are implicitly converted to lowercase
       unless double-quoted.
      </para>

Index: src/backend/utils/adt/oracle_compat.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/utils/adt/oracle_compat.c,v
retrieving revision 1.49
diff -c -r1.49 oracle_compat.c
*** a/src/backend/utils/adt/oracle_compat.c    29 Nov 2003 19:51:59 -0000    1.49
--- b/src/backend/utils/adt/oracle_compat.c    27 Feb 2004 03:21:00 -0000
***************
*** 106,114 ****
   *
   * Purpose:
   *
!  *     Returns string, with first letter of each word in uppercase,
!  *     all other letters in lowercase. A word is delimited by white
!  *     space.
   *
   ********************************************************************/

--- 106,115 ----
   *
   * Purpose:
   *
!  *     Returns string, with first letter of each word in uppercase, all
!  *     other letters in lowercase. A word is defined as a sequence of
!  *     alphanumeric characters, delimited by non-alphanumeric
!  *     characters.
   *
   ********************************************************************/

***************
*** 872,878 ****
   ********************************************************************/

  Datum
! chr            (PG_FUNCTION_ARGS)
  {
      int32        cvalue = PG_GETARG_INT32(0);
      text       *result;
--- 873,879 ----
   ********************************************************************/

  Datum
! chr(PG_FUNCTION_ARGS)
  {
      int32        cvalue = PG_GETARG_INT32(0);
      text       *result;

Re: Fix doc for initcap

From
Dennis Bjorklund
Date:
On Thu, 26 Feb 2004, Neil Conway wrote:

> The improved text is still wrong: initcap() no longer uses whitespace
> to separate words.

Aha, I didn't know the function had changed at all.

How does it work with respect to the locale? When you say that a word is a
sequence of alphanum characters, what does that mean if it is a utf-8
string and we for example have a german locale (or something)?

--
/Dennis Björklund