BUG #7586: PL/Perl problem

From: franco(dot)ricci(at)phys(dot)uniroma1(dot)it
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #7586: PL/Perl problem
Date: 2012-10-06 14:14:47
Message-ID: E1TKV9T-0007eI-6T@wrigleys.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 7586
Logged by: Franco Ricci
Email address: franco(dot)ricci(at)phys(dot)uniroma1(dot)it
PostgreSQL version: 9.0.10
Operating system: FreeBSD 9.0
Description:

I wrote the following function in Perl to make some operations with LLRP
command in a RFID application:
----
CREATE OR REPLACE FUNCTION llrp_command.llrpenc_bytea(xml)
RETURNS bytea AS
$BODY$
use strict;
use RFID::LLRP::Builder qw(encode_message);

my $llrp_xml = shift;
my $llrp_bin = encode_message($llrp_xml);

my $tmp = "";
for(my $i = 0; $i < length($llrp_bin); $i = $i + 1)
{
my $val = substr($llrp_bin, $i, 1);
$tmp = $tmp . sprintf("\\%03o",ord($val));
}
$llrp_bin = $tmp;
return $llrp_bin;
$BODY$
LANGUAGE plperlu IMMUTABLE STRICT
COST 100;
ALTER FUNCTION llrp_command.llrpenc_bytea(xml)
OWNER TO "LLRP";
COMMENT ON FUNCTION llrp_command.llrpenc_bytea(xml) IS 'Encode a xml LLRP
message in LLRP binary format and escape it into bytea';
----

Until version 9.0.8 all works fine. Version 9.0.8, 9.0.9, 9.0.10 and 9.1.6
have some troubles.
In particular when I call llrpenc_bytea function:

SELECT llrp_command.llrpenc_bytea('<llrp:SET_READER_CONFIG
xmlns:llrp="http://www.llrp.org/ltk/schema/core/encoding/xml/1.0"
Version="1" MessageID="2">
<llrp:ResetToFactoryDefault>0</llrp:ResetToFactoryDefault>
<llrp:KeepaliveSpec>
<llrp:KeepaliveTriggerType>Periodic</llrp:KeepaliveTriggerType>
<llrp:PeriodicTriggerValue>30000</llrp:PeriodicTriggerValue>
</llrp:KeepaliveSpec>
</llrp:SET_READER_CONFIG>');

it returns:
-----
ERROR: Entity: line 1: parser error : Document is empty

^
Entity: line 1: parser error : Start tag expected, '<' not found

^
Compilation failed in require at line 3.
BEGIN failed--compilation aborted at line 3.
CONTEXT: compilation of PL/Perl function "llrpenc_bytea"

********** Error **********

ERROR: Entity: line 1: parser error : Document is empty

^
Entity: line 1: parser error : Start tag expected, '<' not found

^
Compilation failed in require at line 3.
BEGIN failed--compilation aborted at line 3.
SQL state: 42601
Context: compilation of PL/Perl function "llrpenc_bytea"
--------

I tried to run the same script as a perl script and it runs fine so I think
the problem is not Perl.
Postgresql version 9.1.2 has no problem.
I think the bug is about as postgresql passes xml argument to perl
interpreter.
The same function with a text argument works well:

----
REATE OR REPLACE FUNCTION llrp_command.llrpenc_bytea(text)
RETURNS bytea AS
$BODY$
use strict;
use RFID::LLRP::Builder qw(encode_message);

my $llrp_xml = shift;
my $llrp_bin = encode_message($llrp_xml);

my $tmp = "";
for(my $i = 0; $i < length($llrp_bin); $i = $i + 1)
{
my $val = substr($llrp_bin, $i, 1);
$tmp = $tmp . sprintf("\\%03o",ord($val));
}
$llrp_bin = $tmp;
return $llrp_bin;
$BODY$
LANGUAGE plperlu IMMUTABLE STRICT
COST 100;
ALTER FUNCTION llrp_command.llrpenc_bytea(text)
OWNER TO "LLRP";
COMMENT ON FUNCTION llrp_command.llrpenc_bytea(text) IS 'Encode a xml LLRP
message in LLRP binary format and escape it into bytea';
----

Thanks a lot for your great work

Regards
Franco Ricci

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message foss 2012-10-06 14:23:23 BUG #7587: createdb allows invalid DB names
Previous Message Bo Thorbjørn Jensen 2012-10-05 12:33:36 exception 0xC0000005 PostgreSQL 9.1.6 on Windows Server 2008 R2