Thread: multi-byte aware char_length() etc.

multi-byte aware char_length() etc.

From
t-ishii@sra.co.jp
Date:
I'm planning to modify some string functions so that they would be
aware of multi-byte strings if compiled with the multi-byte
capability.  Followings are files I'm going to modify. I would like to
hear your opinions if you have any.

o character_length()

It seems that the function is implemented as textlen() in
utils/adt/varlena.c or as varcharlen() in varchar.c. Current
implementaion returns an octet length rather than a char length. So I
will change them. However, there might be necessity for getting an
octet length in some applications. Maybe this is a good chance to add
SQL92's octet_length().

o lower()/upper()

Implemented in oracle_compat.c. One thing I have noticed is that it
uses toupper()/tolower(). For ASCII, they are fine. But on some
platforms (I guess SysV) they might have some problems:

    char c;    /* c is an 8-bit letter and this platform uses char as
           signed char */
    toupper(c);    /* may cause segfault or any other bad thing */

So I will change like:

    toupper((unsigned char)c);

o position()

Implemented as textpos() in varlena.c.

o substring()

Implemented as text_substr() in varlena.c.

--
Tatsuo Ishii
t-ishii@sra.co.jp

Re: [HACKERS] multi-byte aware char_length() etc.

From
"Thomas G. Lockhart"
Date:
> I'm planning to modify some string functions so that they would be
> aware of multi-byte strings if compiled with the multi-byte
> capability.  Followings are files I'm going to modify. I would like to
> hear your opinions if you have any.
>
> o character_length()
>
> It seems that the function is implemented as textlen() in
> utils/adt/varlena.c or as varcharlen() in varchar.c. Current
> implementaion returns an octet length rather than a char length. So I
> will change them. However, there might be necessity for getting an
> octet length in some applications. Maybe this is a good chance to add
> SQL92's octet_length().

Yes.

> o lower()/upper()
>
> Implemented in oracle_compat.c. One thing I have noticed is that it
> uses toupper()/tolower(). For ASCII, they are fine. But on some
> platforms (I guess SysV) they might have some problems:
>
>         char c; /* c is an 8-bit letter and this platform uses char as
>                    signed char */
>         toupper(c);     /* may cause segfault or any other bad thing */
>
> So I will change like:
>
>         toupper((unsigned char)c);

I would like to move these routines, as you clean them up, to varlena.c
or whatever Postgres-specific source file is appropriate. Let's leave
oracle_compat.c for non-standard, Oracle-specific functions. Perhaps
eventually we can move any of those which remain to the contrib
directory, assuming that there are good equivalent functions available
in SQL92.

Sort of annoying having oracle_compat when Oracle doesn't return the
favor by having a "postgres_compat". Well, maybe DataBlades are the same
thing?? :)

> o position()
>
> Implemented as textpos() in varlena.c.
>
> o substring()
>
> Implemented as text_substr() in varlena.c.

These two are OK. I'm not yet clear on where in the parser these varlena
functions are matched up with both text and varchar() types. We may need
to do something different as we keep working on getting the
text/varchar/char behavior improved.

Re: [HACKERS] multi-byte aware char_length() etc.

From
t-ishii@sra.co.jp
Date:
Hi, here are patches I promised (against 6.3.2):

* character_length(), position(), substring() are now aware of
      multi-byte characters
* add octet_length()
* add --with-mb option to configure
* new regression tests for EUC_KR
  (contributed by "Soonmyung. Hong" <hong@lunaris.hanmesoft.co.kr>)
* add some test cases to the EUC_JP regression test
* fix problem in regress/regress.sh in case of System V
* fix toupper(), tolower() to handle 8bit chars

note that:

o  patches for both configure.in and configure are
included. maybe the one for configure is not necessary.

o pg_proc.h was modified to add octet_length(). I used OIDs
(1374-1379) for that. Please let me know if these numbers are not
appropriate.

>> I'm planning to modify some string functions so that they would be
>> aware of multi-byte strings if compiled with the multi-byte
>> capability.  Followings are files I'm going to modify. I would like to
>> hear your opinions if you have any.
>>
>> o character_length()
>>
>> It seems that the function is implemented as textlen() in
>> utils/adt/varlena.c or as varcharlen() in varchar.c. Current
>> implementaion returns an octet length rather than a char length. So I
>> will change them. However, there might be necessity for getting an
>> octet length in some applications. Maybe this is a good chance to add
>> SQL92's octet_length().
>
>Yes.
>
>> o lower()/upper()
>>
>> Implemented in oracle_compat.c. One thing I have noticed is that it
>> uses toupper()/tolower(). For ASCII, they are fine. But on some
>> platforms (I guess SysV) they might have some problems:
>>
>>         char c; /* c is an 8-bit letter and this platform uses char as
>>                    signed char */
>>         toupper(c);     /* may cause segfault or any other bad thing */
>>
>> So I will change like:
>>
>>         toupper((unsigned char)c);
>
>I would like to move these routines, as you clean them up, to varlena.c
>or whatever Postgres-specific source file is appropriate. Let's leave
>oracle_compat.c for non-standard, Oracle-specific functions. Perhaps
>eventually we can move any of those which remain to the contrib
>directory, assuming that there are good equivalent functions available
>in SQL92.
>
>Sort of annoying having oracle_compat when Oracle doesn't return the
>favor by having a "postgres_compat". Well, maybe DataBlades are the same
>thing?? :)
>
>> o position()
>>
>> Implemented as textpos() in varlena.c.
>>
>> o substring()
>>
>> Implemented as text_substr() in varlena.c.
>
>These two are OK. I'm not yet clear on where in the parser these varlena
>functions are matched up with both text and varchar() types. We may need
>to do something different as we keep working on getting the
>text/varchar/char behavior improved.
>

----------------------------- cut here --------------------------
begin 644 cl.patch.gz
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
M;=2[1]�Q!H2H(HYJ$6E"2+0MO1Z9+WO`MJP33908'K.`UU?(RE/\Q8A:L
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
K^L.F\H?+X0^;O!NS]KQTO69:6S>;K)O$U<N=ZJ8L-3.`;P`X2;Q*,+4"`$PR
`
end

Re: [HACKERS] multi-byte aware char_length() etc.

From
Bruce Momjian
Date:
>
> Hi, here are patches I promised (against 6.3.2):
>
> * character_length(), position(), substring() are now aware of
>       multi-byte characters
> * add octet_length()
> * add --with-mb option to configure
> * new regression tests for EUC_KR
>   (contributed by "Soonmyung. Hong" <hong@lunaris.hanmesoft.co.kr>)
> * add some test cases to the EUC_JP regression test
> * fix problem in regress/regress.sh in case of System V
> * fix toupper(), tolower() to handle 8bit chars
>
> note that:
>
> o  patches for both configure.in and configure are
> included. maybe the one for configure is not necessary.
>
> o pg_proc.h was modified to add octet_length(). I used OIDs
> (1374-1379) for that. Please let me know if these numbers are not
> appropriate.

You obviously used /include/catalog/unused_oids for that.  Perfect.

--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
  +  If your life is a hard drive,     |  (610) 353-9879(w)
  +  Christ can be your backup.        |  (610) 853-3000(h)

Re: [HACKERS] multi-byte aware char_length() etc.

From
The Hermit Hacker
Date:
Applied...can you check that I haven't missed anything?

On Thu, 23 Apr 1998 t-ishii@sra.co.jp wrote:

> Hi, here are patches I promised (against 6.3.2):
>
> * character_length(), position(), substring() are now aware of
>       multi-byte characters
> * add octet_length()
> * add --with-mb option to configure
> * new regression tests for EUC_KR
>   (contributed by "Soonmyung. Hong" <hong@lunaris.hanmesoft.co.kr>)
> * add some test cases to the EUC_JP regression test
> * fix problem in regress/regress.sh in case of System V
> * fix toupper(), tolower() to handle 8bit chars
>
> note that:
>
> o  patches for both configure.in and configure are
> included. maybe the one for configure is not necessary.
>
> o pg_proc.h was modified to add octet_length(). I used OIDs
> (1374-1379) for that. Please let me know if these numbers are not
> appropriate.
>


Re: [HACKERS] multi-byte aware char_length() etc.

From
t-ishii@sra.co.jp
Date:
>Applied...can you check that I haven't missed anything?
>
>On Thu, 23 Apr 1998 t-ishii@sra.co.jp wrote:
>
>> Hi, here are patches I promised (against 6.3.2):

Thanks. I will check after Apr 27 version of
postgresql.snapshot.tar.gz gets uploaded.
(I don't have CVSup settings yet)
--
Tatsuo Ishii
t-ishii@sra.co.jp