mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +03:00
Convert Postgres arrays to Perl arrays on PL/perl input arguments
More generally, arrays are turned in Perl array references, and row and composite types are turned into Perl hash references. This is done recursively, in a way that's natural to every Perl programmer. To avoid a backwards compatibility hit, the string representation of each structure is also available if the function requests it. Authors: Alexey Klyukin and Alex Hunsaker. Some code cleanups by me.
This commit is contained in:
@ -32,7 +32,8 @@ SELECT perl_set_int(5);
|
||||
SELECT * FROM perl_set_int(5);
|
||||
|
||||
|
||||
CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text);
|
||||
CREATE TYPE testnestperl AS (f5 integer[]);
|
||||
CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text, f4 testnestperl);
|
||||
|
||||
CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
|
||||
return undef;
|
||||
@ -41,8 +42,9 @@ $$ LANGUAGE plperl;
|
||||
SELECT perl_row();
|
||||
SELECT * FROM perl_row();
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
|
||||
return {f2 => 'hello', f1 => 1, f3 => 'world'};
|
||||
return {f2 => 'hello', f1 => 1, f3 => 'world', 'f4' => { 'f5' => [[1]] } };
|
||||
$$ LANGUAGE plperl;
|
||||
|
||||
SELECT perl_row();
|
||||
@ -60,7 +62,10 @@ CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
|
||||
return [
|
||||
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
|
||||
undef,
|
||||
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
|
||||
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => {} },
|
||||
{ f1 => 4, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => undef }},
|
||||
{ f1 => 5, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => '{1}' }},
|
||||
{ f1 => 6, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => [1] }},
|
||||
];
|
||||
$$ LANGUAGE plperl;
|
||||
|
||||
@ -70,31 +75,33 @@ SELECT * FROM perl_set();
|
||||
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
|
||||
return [
|
||||
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
|
||||
{ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' },
|
||||
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
|
||||
{ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL', 'f4' => undef },
|
||||
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => {} },
|
||||
{ f1 => 4, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => undef }},
|
||||
{ f1 => 5, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => '{1}' }},
|
||||
{ f1 => 6, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => [1] }},
|
||||
{ f1 => 7, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => '({1})' },
|
||||
];
|
||||
$$ LANGUAGE plperl;
|
||||
|
||||
SELECT perl_set();
|
||||
SELECT * FROM perl_set();
|
||||
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
|
||||
return undef;
|
||||
$$ LANGUAGE plperl;
|
||||
|
||||
SELECT perl_record();
|
||||
SELECT * FROM perl_record();
|
||||
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
|
||||
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text, f4 testnestperl);
|
||||
|
||||
CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
|
||||
return {f2 => 'hello', f1 => 1, f3 => 'world'};
|
||||
return {f2 => 'hello', f1 => 1, f3 => 'world', 'f4' => { 'f5' => [1] } };
|
||||
$$ LANGUAGE plperl;
|
||||
|
||||
SELECT perl_record();
|
||||
SELECT * FROM perl_record();
|
||||
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
|
||||
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text, f4 testnestperl);
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
|
||||
@ -297,7 +304,7 @@ SELECT * FROM recurse(3);
|
||||
|
||||
|
||||
---
|
||||
--- Test arrary return
|
||||
--- Test array return
|
||||
---
|
||||
CREATE OR REPLACE FUNCTION array_of_text() RETURNS TEXT[][]
|
||||
LANGUAGE plperl as $$
|
||||
@ -361,6 +368,24 @@ CREATE OR REPLACE FUNCTION perl_spi_prepared_bad(double precision) RETURNS doubl
|
||||
$$ LANGUAGE plperl;
|
||||
SELECT perl_spi_prepared_bad(4.35) as "double precision";
|
||||
|
||||
-- Test with a row type
|
||||
CREATE OR REPLACE FUNCTION perl_spi_prepared() RETURNS INTEGER AS $$
|
||||
my $x = spi_prepare('select $1::footype AS a', 'footype');
|
||||
my $q = spi_exec_prepared( $x, '(1, 2)');
|
||||
spi_freeplan($x);
|
||||
return $q->{rows}->[0]->{a}->{x};
|
||||
$$ LANGUAGE plperl;
|
||||
SELECT * from perl_spi_prepared();
|
||||
|
||||
CREATE OR REPLACE FUNCTION perl_spi_prepared_row(footype) RETURNS footype AS $$
|
||||
my $footype = shift;
|
||||
my $x = spi_prepare('select $1 AS a', 'footype');
|
||||
my $q = spi_exec_prepared( $x, {}, $footype );
|
||||
spi_freeplan($x);
|
||||
return $q->{rows}->[0]->{a};
|
||||
$$ LANGUAGE plperl;
|
||||
SELECT * from perl_spi_prepared_row('(1, 2)');
|
||||
|
||||
-- simple test of a DO block
|
||||
DO $$
|
||||
$a = 'This is a test';
|
||||
|
Reference in New Issue
Block a user