mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Fix hstore_plperl regression tests on some platforms
On some platforms, plperl and plperlu cannot be loaded at the same time. So split the test into two separate test files.
This commit is contained in:
parent
2e3ca04e2e
commit
f95425478a
@ -8,8 +8,7 @@ PG_CPPFLAGS = -I$(top_srcdir)/src/pl/plperl -I$(perl_archlibexp)/CORE -I$(top_sr
|
|||||||
EXTENSION = hstore_plperl hstore_plperlu
|
EXTENSION = hstore_plperl hstore_plperlu
|
||||||
DATA = hstore_plperl--1.0.sql hstore_plperlu--1.0.sql
|
DATA = hstore_plperl--1.0.sql hstore_plperlu--1.0.sql
|
||||||
|
|
||||||
REGRESS = hstore_plperl create_transform
|
REGRESS = hstore_plperl hstore_plperlu create_transform
|
||||||
REGRESS_OPTS = --load-extension=hstore --load-extension=plperl --load-extension=plperlu
|
|
||||||
EXTRA_INSTALL = contrib/hstore
|
EXTRA_INSTALL = contrib/hstore
|
||||||
|
|
||||||
ifdef USE_PGXS
|
ifdef USE_PGXS
|
||||||
|
@ -1,103 +1,17 @@
|
|||||||
|
CREATE EXTENSION hstore;
|
||||||
|
CREATE EXTENSION plperl;
|
||||||
CREATE EXTENSION hstore_plperl;
|
CREATE EXTENSION hstore_plperl;
|
||||||
CREATE EXTENSION hstore_plperlu;
|
|
||||||
SELECT transforms.udt_schema, transforms.udt_name,
|
SELECT transforms.udt_schema, transforms.udt_name,
|
||||||
routine_schema, routine_name,
|
routine_schema, routine_name,
|
||||||
group_name, transform_type
|
group_name, transform_type
|
||||||
FROM information_schema.transforms JOIN information_schema.routines
|
FROM information_schema.transforms JOIN information_schema.routines
|
||||||
USING (specific_catalog, specific_schema, specific_name)
|
USING (specific_catalog, specific_schema, specific_name)
|
||||||
ORDER BY 1, 2, 5, 6;
|
ORDER BY 1, 2, 5, 6;
|
||||||
udt_schema | udt_name | routine_schema | routine_name | group_name | transform_type
|
udt_schema | udt_name | routine_schema | routine_name | group_name | transform_type
|
||||||
------------+----------+----------------+-------------------+------------+----------------
|
------------+----------+----------------+------------------+------------+----------------
|
||||||
public | hstore | public | hstore_to_plperl | plperl | FROM SQL
|
public | hstore | public | hstore_to_plperl | plperl | FROM SQL
|
||||||
public | hstore | public | plperl_to_hstore | plperl | TO SQL
|
public | hstore | public | plperl_to_hstore | plperl | TO SQL
|
||||||
public | hstore | public | hstore_to_plperlu | plperlu | FROM SQL
|
(2 rows)
|
||||||
public | hstore | public | plperlu_to_hstore | plperlu | TO SQL
|
|
||||||
(4 rows)
|
|
||||||
|
|
||||||
-- test hstore -> perl
|
|
||||||
CREATE FUNCTION test1(val hstore) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
SELECT test1('aa=>bb, cc=>NULL'::hstore);
|
|
||||||
INFO: $VAR1 = {
|
|
||||||
'aa' => 'bb',
|
|
||||||
'cc' => undef
|
|
||||||
};
|
|
||||||
|
|
||||||
CONTEXT: PL/Perl function "test1"
|
|
||||||
test1
|
|
||||||
-------
|
|
||||||
2
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
CREATE FUNCTION test1none(val hstore) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
SELECT test1none('aa=>bb, cc=>NULL'::hstore);
|
|
||||||
INFO: $VAR1 = '"aa"=>"bb", "cc"=>NULL';
|
|
||||||
|
|
||||||
CONTEXT: PL/Perl function "test1none"
|
|
||||||
test1none
|
|
||||||
-----------
|
|
||||||
0
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
CREATE FUNCTION test1list(val hstore) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
SELECT test1list('aa=>bb, cc=>NULL'::hstore);
|
|
||||||
INFO: $VAR1 = {
|
|
||||||
'aa' => 'bb',
|
|
||||||
'cc' => undef
|
|
||||||
};
|
|
||||||
|
|
||||||
CONTEXT: PL/Perl function "test1list"
|
|
||||||
test1list
|
|
||||||
-----------
|
|
||||||
2
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
-- test hstore[] -> perl
|
|
||||||
CREATE FUNCTION test1arr(val hstore[]) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]->[0], $_[0]->[1]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
|
|
||||||
INFO: $VAR1 = {
|
|
||||||
'aa' => 'bb',
|
|
||||||
'cc' => undef
|
|
||||||
};
|
|
||||||
$VAR2 = {
|
|
||||||
'dd' => 'ee'
|
|
||||||
};
|
|
||||||
|
|
||||||
CONTEXT: PL/Perl function "test1arr"
|
|
||||||
test1arr
|
|
||||||
----------
|
|
||||||
2
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
-- test perl -> hstore
|
-- test perl -> hstore
|
||||||
CREATE FUNCTION test2() RETURNS hstore
|
CREATE FUNCTION test2() RETURNS hstore
|
||||||
@ -127,87 +41,8 @@ SELECT test2arr();
|
|||||||
{"\"a\"=>\"1\", \"b\"=>\"boo\", \"c\"=>NULL","\"d\"=>\"2\""}
|
{"\"a\"=>\"1\", \"b\"=>\"boo\", \"c\"=>NULL","\"d\"=>\"2\""}
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- test as part of prepare/execute
|
|
||||||
CREATE FUNCTION test3() RETURNS void
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
|
|
||||||
$rv = spi_exec_query(q{SELECT 'aa=>bb, cc=>NULL'::hstore AS col1});
|
|
||||||
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
|
||||||
|
|
||||||
$val = {a => 1, b => 'boo', c => undef};
|
|
||||||
$plan = spi_prepare(q{SELECT $1::text AS col1}, "hstore");
|
|
||||||
$rv = spi_exec_prepared($plan, {}, $val);
|
|
||||||
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
|
||||||
$$;
|
|
||||||
SELECT test3();
|
|
||||||
INFO: $VAR1 = {
|
|
||||||
'aa' => 'bb',
|
|
||||||
'cc' => undef
|
|
||||||
};
|
|
||||||
|
|
||||||
CONTEXT: PL/Perl function "test3"
|
|
||||||
INFO: $VAR1 = '"a"=>"1", "b"=>"boo", "c"=>NULL';
|
|
||||||
|
|
||||||
CONTEXT: PL/Perl function "test3"
|
|
||||||
test3
|
|
||||||
-------
|
|
||||||
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
-- test trigger
|
|
||||||
CREATE TABLE test1 (a int, b hstore);
|
|
||||||
INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
|
|
||||||
SELECT * FROM test1;
|
|
||||||
a | b
|
|
||||||
---+------------------------
|
|
||||||
1 | "aa"=>"bb", "cc"=>NULL
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
CREATE FUNCTION test4() RETURNS trigger
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_TD->{new}));
|
|
||||||
if ($_TD->{new}{a} == 1) {
|
|
||||||
$_TD->{new}{b} = {a => 1, b => 'boo', c => undef};
|
|
||||||
}
|
|
||||||
|
|
||||||
return "MODIFY";
|
|
||||||
$$;
|
|
||||||
CREATE TRIGGER test4 BEFORE UPDATE ON test1 FOR EACH ROW EXECUTE PROCEDURE test4();
|
|
||||||
UPDATE test1 SET a = a;
|
|
||||||
INFO: $VAR1 = {
|
|
||||||
'a' => '1',
|
|
||||||
'b' => {
|
|
||||||
'aa' => 'bb',
|
|
||||||
'cc' => undef
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
CONTEXT: PL/Perl function "test4"
|
|
||||||
SELECT * FROM test1;
|
|
||||||
a | b
|
|
||||||
---+---------------------------------
|
|
||||||
1 | "a"=>"1", "b"=>"boo", "c"=>NULL
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
DROP TABLE test1;
|
|
||||||
DROP FUNCTION test1(hstore);
|
|
||||||
DROP FUNCTION test1none(hstore);
|
|
||||||
DROP FUNCTION test1list(hstore);
|
|
||||||
DROP FUNCTION test1arr(hstore[]);
|
|
||||||
DROP FUNCTION test2();
|
DROP FUNCTION test2();
|
||||||
DROP FUNCTION test2arr();
|
DROP FUNCTION test2arr();
|
||||||
DROP FUNCTION test3();
|
|
||||||
DROP FUNCTION test4();
|
|
||||||
DROP EXTENSION hstore_plperl;
|
DROP EXTENSION hstore_plperl;
|
||||||
DROP EXTENSION hstore_plperlu;
|
|
||||||
DROP EXTENSION hstore;
|
DROP EXTENSION hstore;
|
||||||
DROP EXTENSION plperl;
|
DROP EXTENSION plperl;
|
||||||
DROP EXTENSION plperlu;
|
|
||||||
|
180
contrib/hstore_plperl/expected/hstore_plperlu.out
Normal file
180
contrib/hstore_plperl/expected/hstore_plperlu.out
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
CREATE EXTENSION hstore;
|
||||||
|
CREATE EXTENSION plperlu;
|
||||||
|
CREATE EXTENSION hstore_plperlu;
|
||||||
|
SELECT transforms.udt_schema, transforms.udt_name,
|
||||||
|
routine_schema, routine_name,
|
||||||
|
group_name, transform_type
|
||||||
|
FROM information_schema.transforms JOIN information_schema.routines
|
||||||
|
USING (specific_catalog, specific_schema, specific_name)
|
||||||
|
ORDER BY 1, 2, 5, 6;
|
||||||
|
udt_schema | udt_name | routine_schema | routine_name | group_name | transform_type
|
||||||
|
------------+----------+----------------+-------------------+------------+----------------
|
||||||
|
public | hstore | public | hstore_to_plperlu | plperlu | FROM SQL
|
||||||
|
public | hstore | public | plperlu_to_hstore | plperlu | TO SQL
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
-- test hstore -> perl
|
||||||
|
CREATE FUNCTION test1(val hstore) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
SELECT test1('aa=>bb, cc=>NULL'::hstore);
|
||||||
|
INFO: $VAR1 = {
|
||||||
|
'aa' => 'bb',
|
||||||
|
'cc' => undef
|
||||||
|
};
|
||||||
|
|
||||||
|
CONTEXT: PL/Perl function "test1"
|
||||||
|
test1
|
||||||
|
-------
|
||||||
|
2
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
CREATE FUNCTION test1none(val hstore) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
SELECT test1none('aa=>bb, cc=>NULL'::hstore);
|
||||||
|
INFO: $VAR1 = '"aa"=>"bb", "cc"=>NULL';
|
||||||
|
|
||||||
|
CONTEXT: PL/Perl function "test1none"
|
||||||
|
test1none
|
||||||
|
-----------
|
||||||
|
0
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
CREATE FUNCTION test1list(val hstore) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
SELECT test1list('aa=>bb, cc=>NULL'::hstore);
|
||||||
|
INFO: $VAR1 = {
|
||||||
|
'aa' => 'bb',
|
||||||
|
'cc' => undef
|
||||||
|
};
|
||||||
|
|
||||||
|
CONTEXT: PL/Perl function "test1list"
|
||||||
|
test1list
|
||||||
|
-----------
|
||||||
|
2
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- test hstore[] -> perl
|
||||||
|
CREATE FUNCTION test1arr(val hstore[]) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]->[0], $_[0]->[1]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
|
||||||
|
INFO: $VAR1 = {
|
||||||
|
'aa' => 'bb',
|
||||||
|
'cc' => undef
|
||||||
|
};
|
||||||
|
$VAR2 = {
|
||||||
|
'dd' => 'ee'
|
||||||
|
};
|
||||||
|
|
||||||
|
CONTEXT: PL/Perl function "test1arr"
|
||||||
|
test1arr
|
||||||
|
----------
|
||||||
|
2
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- test as part of prepare/execute
|
||||||
|
CREATE FUNCTION test3() RETURNS void
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
|
||||||
|
$rv = spi_exec_query(q{SELECT 'aa=>bb, cc=>NULL'::hstore AS col1});
|
||||||
|
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
||||||
|
|
||||||
|
$val = {a => 1, b => 'boo', c => undef};
|
||||||
|
$plan = spi_prepare(q{SELECT $1::text AS col1}, "hstore");
|
||||||
|
$rv = spi_exec_prepared($plan, {}, $val);
|
||||||
|
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
||||||
|
$$;
|
||||||
|
SELECT test3();
|
||||||
|
INFO: $VAR1 = {
|
||||||
|
'aa' => 'bb',
|
||||||
|
'cc' => undef
|
||||||
|
};
|
||||||
|
|
||||||
|
CONTEXT: PL/Perl function "test3"
|
||||||
|
INFO: $VAR1 = '"a"=>"1", "b"=>"boo", "c"=>NULL';
|
||||||
|
|
||||||
|
CONTEXT: PL/Perl function "test3"
|
||||||
|
test3
|
||||||
|
-------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- test trigger
|
||||||
|
CREATE TABLE test1 (a int, b hstore);
|
||||||
|
INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
|
||||||
|
SELECT * FROM test1;
|
||||||
|
a | b
|
||||||
|
---+------------------------
|
||||||
|
1 | "aa"=>"bb", "cc"=>NULL
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
CREATE FUNCTION test4() RETURNS trigger
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_TD->{new}));
|
||||||
|
if ($_TD->{new}{a} == 1) {
|
||||||
|
$_TD->{new}{b} = {a => 1, b => 'boo', c => undef};
|
||||||
|
}
|
||||||
|
|
||||||
|
return "MODIFY";
|
||||||
|
$$;
|
||||||
|
CREATE TRIGGER test4 BEFORE UPDATE ON test1 FOR EACH ROW EXECUTE PROCEDURE test4();
|
||||||
|
UPDATE test1 SET a = a;
|
||||||
|
INFO: $VAR1 = {
|
||||||
|
'a' => '1',
|
||||||
|
'b' => {
|
||||||
|
'aa' => 'bb',
|
||||||
|
'cc' => undef
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CONTEXT: PL/Perl function "test4"
|
||||||
|
SELECT * FROM test1;
|
||||||
|
a | b
|
||||||
|
---+---------------------------------
|
||||||
|
1 | "a"=>"1", "b"=>"boo", "c"=>NULL
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
||||||
|
DROP FUNCTION test1(hstore);
|
||||||
|
DROP FUNCTION test1none(hstore);
|
||||||
|
DROP FUNCTION test1list(hstore);
|
||||||
|
DROP FUNCTION test1arr(hstore[]);
|
||||||
|
DROP FUNCTION test3();
|
||||||
|
DROP FUNCTION test4();
|
||||||
|
DROP EXTENSION hstore_plperlu;
|
||||||
|
DROP EXTENSION hstore;
|
||||||
|
DROP EXTENSION plperlu;
|
@ -1,5 +1,6 @@
|
|||||||
|
CREATE EXTENSION hstore;
|
||||||
|
CREATE EXTENSION plperl;
|
||||||
CREATE EXTENSION hstore_plperl;
|
CREATE EXTENSION hstore_plperl;
|
||||||
CREATE EXTENSION hstore_plperlu;
|
|
||||||
|
|
||||||
SELECT transforms.udt_schema, transforms.udt_name,
|
SELECT transforms.udt_schema, transforms.udt_name,
|
||||||
routine_schema, routine_name,
|
routine_schema, routine_name,
|
||||||
@ -9,57 +10,6 @@ FROM information_schema.transforms JOIN information_schema.routines
|
|||||||
ORDER BY 1, 2, 5, 6;
|
ORDER BY 1, 2, 5, 6;
|
||||||
|
|
||||||
|
|
||||||
-- test hstore -> perl
|
|
||||||
CREATE FUNCTION test1(val hstore) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
|
|
||||||
SELECT test1('aa=>bb, cc=>NULL'::hstore);
|
|
||||||
|
|
||||||
CREATE FUNCTION test1none(val hstore) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
|
|
||||||
SELECT test1none('aa=>bb, cc=>NULL'::hstore);
|
|
||||||
|
|
||||||
CREATE FUNCTION test1list(val hstore) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
|
|
||||||
SELECT test1list('aa=>bb, cc=>NULL'::hstore);
|
|
||||||
|
|
||||||
|
|
||||||
-- test hstore[] -> perl
|
|
||||||
CREATE FUNCTION test1arr(val hstore[]) RETURNS int
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_[0]->[0], $_[0]->[1]));
|
|
||||||
return scalar(keys %{$_[0]});
|
|
||||||
$$;
|
|
||||||
|
|
||||||
SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
|
|
||||||
|
|
||||||
|
|
||||||
-- test perl -> hstore
|
-- test perl -> hstore
|
||||||
CREATE FUNCTION test2() RETURNS hstore
|
CREATE FUNCTION test2() RETURNS hstore
|
||||||
LANGUAGE plperl
|
LANGUAGE plperl
|
||||||
@ -84,65 +34,10 @@ $$;
|
|||||||
SELECT test2arr();
|
SELECT test2arr();
|
||||||
|
|
||||||
|
|
||||||
-- test as part of prepare/execute
|
|
||||||
CREATE FUNCTION test3() RETURNS void
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
|
|
||||||
$rv = spi_exec_query(q{SELECT 'aa=>bb, cc=>NULL'::hstore AS col1});
|
|
||||||
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
|
||||||
|
|
||||||
$val = {a => 1, b => 'boo', c => undef};
|
|
||||||
$plan = spi_prepare(q{SELECT $1::text AS col1}, "hstore");
|
|
||||||
$rv = spi_exec_prepared($plan, {}, $val);
|
|
||||||
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
|
||||||
$$;
|
|
||||||
|
|
||||||
SELECT test3();
|
|
||||||
|
|
||||||
|
|
||||||
-- test trigger
|
|
||||||
CREATE TABLE test1 (a int, b hstore);
|
|
||||||
INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
|
|
||||||
SELECT * FROM test1;
|
|
||||||
|
|
||||||
CREATE FUNCTION test4() RETURNS trigger
|
|
||||||
LANGUAGE plperlu
|
|
||||||
TRANSFORM FOR TYPE hstore
|
|
||||||
AS $$
|
|
||||||
use Data::Dumper;
|
|
||||||
$Data::Dumper::Sortkeys = 1;
|
|
||||||
elog(INFO, Dumper($_TD->{new}));
|
|
||||||
if ($_TD->{new}{a} == 1) {
|
|
||||||
$_TD->{new}{b} = {a => 1, b => 'boo', c => undef};
|
|
||||||
}
|
|
||||||
|
|
||||||
return "MODIFY";
|
|
||||||
$$;
|
|
||||||
|
|
||||||
CREATE TRIGGER test4 BEFORE UPDATE ON test1 FOR EACH ROW EXECUTE PROCEDURE test4();
|
|
||||||
|
|
||||||
UPDATE test1 SET a = a;
|
|
||||||
SELECT * FROM test1;
|
|
||||||
|
|
||||||
|
|
||||||
DROP TABLE test1;
|
|
||||||
|
|
||||||
DROP FUNCTION test1(hstore);
|
|
||||||
DROP FUNCTION test1none(hstore);
|
|
||||||
DROP FUNCTION test1list(hstore);
|
|
||||||
DROP FUNCTION test1arr(hstore[]);
|
|
||||||
DROP FUNCTION test2();
|
DROP FUNCTION test2();
|
||||||
DROP FUNCTION test2arr();
|
DROP FUNCTION test2arr();
|
||||||
DROP FUNCTION test3();
|
|
||||||
DROP FUNCTION test4();
|
|
||||||
|
|
||||||
|
|
||||||
DROP EXTENSION hstore_plperl;
|
DROP EXTENSION hstore_plperl;
|
||||||
DROP EXTENSION hstore_plperlu;
|
|
||||||
DROP EXTENSION hstore;
|
DROP EXTENSION hstore;
|
||||||
DROP EXTENSION plperl;
|
DROP EXTENSION plperl;
|
||||||
DROP EXTENSION plperlu;
|
|
||||||
|
121
contrib/hstore_plperl/sql/hstore_plperlu.sql
Normal file
121
contrib/hstore_plperl/sql/hstore_plperlu.sql
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
CREATE EXTENSION hstore;
|
||||||
|
CREATE EXTENSION plperlu;
|
||||||
|
CREATE EXTENSION hstore_plperlu;
|
||||||
|
|
||||||
|
SELECT transforms.udt_schema, transforms.udt_name,
|
||||||
|
routine_schema, routine_name,
|
||||||
|
group_name, transform_type
|
||||||
|
FROM information_schema.transforms JOIN information_schema.routines
|
||||||
|
USING (specific_catalog, specific_schema, specific_name)
|
||||||
|
ORDER BY 1, 2, 5, 6;
|
||||||
|
|
||||||
|
|
||||||
|
-- test hstore -> perl
|
||||||
|
CREATE FUNCTION test1(val hstore) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
|
||||||
|
SELECT test1('aa=>bb, cc=>NULL'::hstore);
|
||||||
|
|
||||||
|
CREATE FUNCTION test1none(val hstore) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
|
||||||
|
SELECT test1none('aa=>bb, cc=>NULL'::hstore);
|
||||||
|
|
||||||
|
CREATE FUNCTION test1list(val hstore) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
|
||||||
|
SELECT test1list('aa=>bb, cc=>NULL'::hstore);
|
||||||
|
|
||||||
|
|
||||||
|
-- test hstore[] -> perl
|
||||||
|
CREATE FUNCTION test1arr(val hstore[]) RETURNS int
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_[0]->[0], $_[0]->[1]));
|
||||||
|
return scalar(keys %{$_[0]});
|
||||||
|
$$;
|
||||||
|
|
||||||
|
SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
|
||||||
|
|
||||||
|
|
||||||
|
-- test as part of prepare/execute
|
||||||
|
CREATE FUNCTION test3() RETURNS void
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
|
||||||
|
$rv = spi_exec_query(q{SELECT 'aa=>bb, cc=>NULL'::hstore AS col1});
|
||||||
|
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
||||||
|
|
||||||
|
$val = {a => 1, b => 'boo', c => undef};
|
||||||
|
$plan = spi_prepare(q{SELECT $1::text AS col1}, "hstore");
|
||||||
|
$rv = spi_exec_prepared($plan, {}, $val);
|
||||||
|
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
|
||||||
|
$$;
|
||||||
|
|
||||||
|
SELECT test3();
|
||||||
|
|
||||||
|
|
||||||
|
-- test trigger
|
||||||
|
CREATE TABLE test1 (a int, b hstore);
|
||||||
|
INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
|
||||||
|
SELECT * FROM test1;
|
||||||
|
|
||||||
|
CREATE FUNCTION test4() RETURNS trigger
|
||||||
|
LANGUAGE plperlu
|
||||||
|
TRANSFORM FOR TYPE hstore
|
||||||
|
AS $$
|
||||||
|
use Data::Dumper;
|
||||||
|
$Data::Dumper::Sortkeys = 1;
|
||||||
|
elog(INFO, Dumper($_TD->{new}));
|
||||||
|
if ($_TD->{new}{a} == 1) {
|
||||||
|
$_TD->{new}{b} = {a => 1, b => 'boo', c => undef};
|
||||||
|
}
|
||||||
|
|
||||||
|
return "MODIFY";
|
||||||
|
$$;
|
||||||
|
|
||||||
|
CREATE TRIGGER test4 BEFORE UPDATE ON test1 FOR EACH ROW EXECUTE PROCEDURE test4();
|
||||||
|
|
||||||
|
UPDATE test1 SET a = a;
|
||||||
|
SELECT * FROM test1;
|
||||||
|
|
||||||
|
|
||||||
|
DROP TABLE test1;
|
||||||
|
|
||||||
|
DROP FUNCTION test1(hstore);
|
||||||
|
DROP FUNCTION test1none(hstore);
|
||||||
|
DROP FUNCTION test1list(hstore);
|
||||||
|
DROP FUNCTION test1arr(hstore[]);
|
||||||
|
DROP FUNCTION test3();
|
||||||
|
DROP FUNCTION test4();
|
||||||
|
|
||||||
|
|
||||||
|
DROP EXTENSION hstore_plperlu;
|
||||||
|
DROP EXTENSION hstore;
|
||||||
|
DROP EXTENSION plperlu;
|
Loading…
x
Reference in New Issue
Block a user