Обсуждение: Arrays of Records in PL/Perl

Поиск
Список
Период
Сортировка

Arrays of Records in PL/Perl

От
"David E. Wheeler"
Дата:
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
recordsare passed, the record are stringified, rather than turned into hashes. This seems inconsistent. Bug? 

Thanks,

David



Re: Arrays of Records in PL/Perl

От
Alex Hunsaker
Дата:
On Tue, Jul 12, 2011 at 12:45, David E. Wheeler <david@kineticode.com> 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
recordsare 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. ]


Re: Arrays of Records in PL/Perl

От
"David E. Wheeler"
Дата:
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