Обсуждение: lower function
Hello,
I have a database with encoding latin2, ctype hu_HU, posgresql 8.0.1.
Keyword split is a plperl function:
create or replace function keywords_split(text) returns text as $$
my $text = lc $_[0];
return $text;
$$
language plperl;
My problem is:
$ psql teszt;
Welcome to psql 8.0.1, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
teszt=# select lower('úéöÖÉÁ');
lower
--------
úéööéá
(1 row)
teszt=# select keywords_split('AúéöÖÉÁ');
keywords_split
----------------
aúéöÖÉÁ
(1 row)
teszt=# select lower('úéöÖÉÁ');
lower
--------
úéöÖÉÁ
(1 row)
Mage
Mage wrote:
> teszt=# select keywords_split('AúéöÖÉÁ');
> keywords_split
> ----------------
> aúéöÖÉÁ
> (1 row)
What happens if you add
use locale;
in your perl function before calling lc ?
--
Daniel
PostgreSQL-powered mail user agent and storage: http://www.manitou-mail.org
Daniel Verite wrote:
> Mage wrote:
>
>
>
>>teszt=# select keywords_split('AúéöÖÉÁ');
>> keywords_split
>>----------------
>> aúéöÖÉÁ
>>(1 row)
>>
>>
>
>What happens if you add
> use locale;
>in your perl function before calling lc ?
>
>
with use locale;:
select keywords_split('AúéöÖÉÁ');
ERROR: creation of Perl function failed: 'require' trapped by operation
mask at (eval 6) line 2.
Another problem:
create or replace function keywords_split(text) returns text as $$
my $res = spi_exec_query("select lower('" . $_[0] . "')");
my $text = 'test' . $res->{rows}[0]->{lower};
return $text;
$$
language plperl;
# select keywords_split('AúéöÖÉÁ');
keywords_split
----------------
testaúéöÖÉÁ
(1 row)
The spi_exec_query with lower also don't work.
I have found another bug in a plperl trigger which I can't reproduce. I
find plperl a bit buggy.
Mage
Mage wrote:
> with use locale;:
>
> select keywords_split('AúéöÖÉÁ');
> ERROR: creation of Perl function failed: 'require' trapped by operation
> mask at (eval 6) line 2.
Ah. So maybe it would work with plperlu instead of plperl.
--
Daniel
PostgreSQL-powered mail user agent and storage: http://www.manitou-mail.org
Daniel Verite wrote:
> Mage wrote:
>
>
>
>>with use locale;:
>>
>>select keywords_split('AúéöÖÉÁ');
>>ERROR: creation of Perl function failed: 'require' trapped by operation
>>mask at (eval 6) line 2.
>>
>>
>
>Ah. So maybe it would work with plperlu instead of plperl.
>
>
I did, and it didn't help.
Mage
It's serious.
teszt=# select lower('AúéöÖÉÁ');
lower
---------
aúéööéá
(1 row)
teszt=# create or replace function keywords_split(text) returns text as $$
teszt$# return '';
teszt$# $$
teszt-# language plperlu;
CREATE FUNCTION
teszt=# select keywords_split('');
keywords_split
----------------
(1 row)
teszt=# select lower('AúéöÖÉÁ');
lower
---------
aúéöÖÉÁ
(1 row)
Mage
Mage <mage@mage.hu> writes:
> It's serious.
That's a Perl bug not a Postgres bug: libperl should not change the
process's locale settings, or at least if it does it should restore
the prior settings before returning. It doesn't.
regards, tom lane
Tom Lane wrote:
>Mage <mage@mage.hu> writes:
>
>
>>It's serious.
>>
>>
>
>That's a Perl bug not a Postgres bug: libperl should not change the
>process's locale settings, or at least if it does it should restore
>the prior settings before returning. It doesn't.
>
>
>
I checked with show all, client and server encoding remained latin2, and
lc_ctype remained hu_HU. However, the lower function got corrupted
(encoding) until the end of the session.
I can reproduce the bug on an Debian Sarge and on a Gentoo. Both are
up-to-date.
What should I do? Subscribe to perl list and tell about this? I have to
write a trigger which can't be written well in plpgsql. My options are
to learn python or tcl on basic level in one day. I am not sure I want
and can do this.
Mage
On Wed, 2005-04-06 at 17:26, Mage wrote: > Tom Lane wrote: > > >Mage <mage@mage.hu> writes: > > > > > >>It's serious. > >> > >> > > > >That's a Perl bug not a Postgres bug: libperl should not change the > >process's locale settings, or at least if it does it should restore > >the prior settings before returning. It doesn't. > > > > > > > I checked with show all, client and server encoding remained latin2, and > lc_ctype remained hu_HU. However, the lower function got corrupted > (encoding) until the end of the session. > > I can reproduce the bug on an Debian Sarge and on a Gentoo. Both are > up-to-date. > > What should I do? Subscribe to perl list and tell about this? I have to > write a trigger which can't be written well in plpgsql. My options are > to learn python or tcl on basic level in one day. I am not sure I want > and can do this. You're far more likely to learn tcl or python or php in an afternoon than to get a patched perl executable in that time. But I'd still report the bug to them.
Scott Marlowe wrote:
>
>You're far more likely to learn tcl or python or php in an afternoon
>than to get a patched perl executable in that time.
>
>But I'd still report the bug to them.
>
>
create or replace function keywords_split(text) returns text as $$
use locale;
use POSIX qw(locale_h);
setlocale(LC_CTYPE,'hu_HU');
return '';
$$
language plperlu;
It works. And it's so nasty. I have to insert these into every plperl
function.
I am not subscribed to any perl list. Would someone report this bug?
Mage