Re: Fix doc for initcap - Mailing list pgsql-patches

From Neil Conway
Subject Re: Fix doc for initcap
Date
Msg-id 87k729i32f.fsf@mailbox.samurai.com
Whole thread Raw
In response to Fix doc for initcap  (Dennis Bjorklund <db@zigo.dhs.org>)
Responses Re: Fix doc for initcap  (Dennis Bjorklund <db@zigo.dhs.org>)
List pgsql-patches
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;

pgsql-patches by date:

Previous
From: Dennis Bjorklund
Date:
Subject: Fix doc for initcap
Next
From: Dennis Bjorklund
Date:
Subject: Re: Fix doc for initcap