FAQ
Hackers,

Given this script:

BEGIN;

CREATE TYPE foo AS ( this int, that int );

CREATE OR REPLACE FUNCTION dump(foo[]) returns text language plperlu AS $$
use Data::Dumper; Dumper shift;
$$;

CREATE OR REPLACE FUNCTION dump(foo) returns text language plperlu AS $$
use Data::Dumper; Dumper shift;
$$;

select dump(row(3, 5)::foo);
select dump(ARRAY[row(3, 5)::foo]);

ROLLBACK;

The output is:

dump
--------------------------
$VAR1 = { +
'that' => '5',+
'this' => '3' +
}; +

(1 row)

Time: 0.936 ms
dump
----------------------
$VAR1 = '{"(3,5)"}';+

(1 row)

That is, if a record is passed to a PL/Perl function, it's correctly converted into a hash. If, however, an array of records are passed, the record are stringified, rather than turned into hashes. This seems inconsistent. Bug?

Thanks,

David

Search Discussions

  • Alex Hunsaker at Jul 12, 2011 at 7:20 pm

    On Tue, Jul 12, 2011 at 12:45, David E. Wheeler wrote:
    Hackers,
    That is, if a record is passed to a PL/Perl function, it's correctly converted into a hash. If, however, an array of records are passed, the record are stringified, rather than turned into hashes. This seems inconsistent. Bug?
    All Arrays in 9.0 and lower are strings, regardless of if they are
    comprised of composite types. Its not so much a bug as a limitation.
    Alexey Klyukin fixed this for 9.1 :-)

    [ In 9.1 we could not make them straight perl arrayrefs as we needed
    to keep the string representation for backwards compatibility. What we
    did in 9.1 is overload the arrayref and string operations on blessed
    object so you can treat it as either. ]
  • David E. Wheeler at Jul 12, 2011 at 10:06 pm

    On Jul 12, 2011, at 12:19 PM, Alex Hunsaker wrote:

    All Arrays in 9.0 and lower are strings, regardless of if they are
    comprised of composite types. Its not so much a bug as a limitation.
    Alexey Klyukin fixed this for 9.1 :-)
    Oh?

    dump
    --------------------------
    $VAR1 = { +
    'that' => '5',+
    'this' => '3' +
    }; +

    (1 row)

    Time: 2.016 ms
    dump
    ----------------------------------------------------
    $VAR1 = bless( { +
    'array' => [ +
    { +
    'that' => '5', +
    'this' => '3' +
    } +
    ], +
    'typeoid' => 16457 +
    }, 'PostgreSQL::InServer::ARRAY' );+

    (1 row)

    Woo! Thanks!
    [ In 9.1 we could not make them straight perl arrayrefs as we needed
    to keep the string representation for backwards compatibility. What we
    did in 9.1 is overload the arrayref and string operations on blessed
    object so you can treat it as either. ]
    Yep, awesome.

    Best,

    David

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppgsql-hackers @
categoriespostgresql
postedJul 12, '11 at 6:54p
activeJul 12, '11 at 10:06p
posts3
users2
websitepostgresql.org...
irc#postgresql

2 users in discussion

David E. Wheeler: 2 posts Alex Hunsaker: 1 post

People

Translate

site design / logo © 2021 Grokbase