Skip to content

Commit f954254

Browse files
committed
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.
1 parent 2e3ca04 commit f954254

File tree

5 files changed

+311
-281
lines changed

5 files changed

+311
-281
lines changed

contrib/hstore_plperl/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ PG_CPPFLAGS = -I$(top_srcdir)/src/pl/plperl -I$(perl_archlibexp)/CORE -I$(top_sr
88
EXTENSION = hstore_plperl hstore_plperlu
99
DATA = hstore_plperl--1.0.sql hstore_plperlu--1.0.sql
1010

11-
REGRESS = hstore_plperl create_transform
12-
REGRESS_OPTS = --load-extension=hstore --load-extension=plperl --load-extension=plperlu
11+
REGRESS = hstore_plperl hstore_plperlu create_transform
1312
EXTRA_INSTALL = contrib/hstore
1413

1514
ifdef USE_PGXS
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,17 @@
1+
CREATE EXTENSION hstore;
2+
CREATE EXTENSION plperl;
13
CREATE EXTENSION hstore_plperl;
2-
CREATE EXTENSION hstore_plperlu;
34
SELECT transforms.udt_schema, transforms.udt_name,
45
routine_schema, routine_name,
56
group_name, transform_type
67
FROM information_schema.transforms JOIN information_schema.routines
78
USING (specific_catalog, specific_schema, specific_name)
89
ORDER BY 1, 2, 5, 6;
9-
udt_schema | udt_name | routine_schema | routine_name | group_name | transform_type
10-
------------+----------+----------------+-------------------+------------+----------------
11-
public | hstore | public | hstore_to_plperl | plperl | FROM SQL
12-
public | hstore | public | plperl_to_hstore | plperl | TO SQL
13-
public | hstore | public | hstore_to_plperlu | plperlu | FROM SQL
14-
public | hstore | public | plperlu_to_hstore | plperlu | TO SQL
15-
(4 rows)
16-
17-
-- test hstore -> perl
18-
CREATE FUNCTION test1(val hstore) RETURNS int
19-
LANGUAGE plperlu
20-
TRANSFORM FOR TYPE hstore
21-
AS $$
22-
use Data::Dumper;
23-
$Data::Dumper::Sortkeys = 1;
24-
elog(INFO, Dumper($_[0]));
25-
return scalar(keys %{$_[0]});
26-
$$;
27-
SELECT test1('aa=>bb, cc=>NULL'::hstore);
28-
INFO: $VAR1 = {
29-
'aa' => 'bb',
30-
'cc' => undef
31-
};
32-
33-
CONTEXT: PL/Perl function "test1"
34-
test1
35-
-------
36-
2
37-
(1 row)
38-
39-
CREATE FUNCTION test1none(val hstore) RETURNS int
40-
LANGUAGE plperlu
41-
AS $$
42-
use Data::Dumper;
43-
$Data::Dumper::Sortkeys = 1;
44-
elog(INFO, Dumper($_[0]));
45-
return scalar(keys %{$_[0]});
46-
$$;
47-
SELECT test1none('aa=>bb, cc=>NULL'::hstore);
48-
INFO: $VAR1 = '"aa"=>"bb", "cc"=>NULL';
49-
50-
CONTEXT: PL/Perl function "test1none"
51-
test1none
52-
-----------
53-
0
54-
(1 row)
55-
56-
CREATE FUNCTION test1list(val hstore) RETURNS int
57-
LANGUAGE plperlu
58-
TRANSFORM FOR TYPE hstore
59-
AS $$
60-
use Data::Dumper;
61-
$Data::Dumper::Sortkeys = 1;
62-
elog(INFO, Dumper($_[0]));
63-
return scalar(keys %{$_[0]});
64-
$$;
65-
SELECT test1list('aa=>bb, cc=>NULL'::hstore);
66-
INFO: $VAR1 = {
67-
'aa' => 'bb',
68-
'cc' => undef
69-
};
70-
71-
CONTEXT: PL/Perl function "test1list"
72-
test1list
73-
-----------
74-
2
75-
(1 row)
76-
77-
-- test hstore[] -> perl
78-
CREATE FUNCTION test1arr(val hstore[]) RETURNS int
79-
LANGUAGE plperlu
80-
TRANSFORM FOR TYPE hstore
81-
AS $$
82-
use Data::Dumper;
83-
$Data::Dumper::Sortkeys = 1;
84-
elog(INFO, Dumper($_[0]->[0], $_[0]->[1]));
85-
return scalar(keys %{$_[0]});
86-
$$;
87-
SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
88-
INFO: $VAR1 = {
89-
'aa' => 'bb',
90-
'cc' => undef
91-
};
92-
$VAR2 = {
93-
'dd' => 'ee'
94-
};
95-
96-
CONTEXT: PL/Perl function "test1arr"
97-
test1arr
98-
----------
99-
2
100-
(1 row)
10+
udt_schema | udt_name | routine_schema | routine_name | group_name | transform_type
11+
------------+----------+----------------+------------------+------------+----------------
12+
public | hstore | public | hstore_to_plperl | plperl | FROM SQL
13+
public | hstore | public | plperl_to_hstore | plperl | TO SQL
14+
(2 rows)
10115

10216
-- test perl -> hstore
10317
CREATE FUNCTION test2() RETURNS hstore
@@ -127,87 +41,8 @@ SELECT test2arr();
12741
{"\"a\"=>\"1\", \"b\"=>\"boo\", \"c\"=>NULL","\"d\"=>\"2\""}
12842
(1 row)
12943

130-
-- test as part of prepare/execute
131-
CREATE FUNCTION test3() RETURNS void
132-
LANGUAGE plperlu
133-
TRANSFORM FOR TYPE hstore
134-
AS $$
135-
use Data::Dumper;
136-
$Data::Dumper::Sortkeys = 1;
137-
138-
$rv = spi_exec_query(q{SELECT 'aa=>bb, cc=>NULL'::hstore AS col1});
139-
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
140-
141-
$val = {a => 1, b => 'boo', c => undef};
142-
$plan = spi_prepare(q{SELECT $1::text AS col1}, "hstore");
143-
$rv = spi_exec_prepared($plan, {}, $val);
144-
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
145-
$$;
146-
SELECT test3();
147-
INFO: $VAR1 = {
148-
'aa' => 'bb',
149-
'cc' => undef
150-
};
151-
152-
CONTEXT: PL/Perl function "test3"
153-
INFO: $VAR1 = '"a"=>"1", "b"=>"boo", "c"=>NULL';
154-
155-
CONTEXT: PL/Perl function "test3"
156-
test3
157-
-------
158-
159-
(1 row)
160-
161-
-- test trigger
162-
CREATE TABLE test1 (a int, b hstore);
163-
INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
164-
SELECT * FROM test1;
165-
a | b
166-
---+------------------------
167-
1 | "aa"=>"bb", "cc"=>NULL
168-
(1 row)
169-
170-
CREATE FUNCTION test4() RETURNS trigger
171-
LANGUAGE plperlu
172-
TRANSFORM FOR TYPE hstore
173-
AS $$
174-
use Data::Dumper;
175-
$Data::Dumper::Sortkeys = 1;
176-
elog(INFO, Dumper($_TD->{new}));
177-
if ($_TD->{new}{a} == 1) {
178-
$_TD->{new}{b} = {a => 1, b => 'boo', c => undef};
179-
}
180-
181-
return "MODIFY";
182-
$$;
183-
CREATE TRIGGER test4 BEFORE UPDATE ON test1 FOR EACH ROW EXECUTE PROCEDURE test4();
184-
UPDATE test1 SET a = a;
185-
INFO: $VAR1 = {
186-
'a' => '1',
187-
'b' => {
188-
'aa' => 'bb',
189-
'cc' => undef
190-
}
191-
};
192-
193-
CONTEXT: PL/Perl function "test4"
194-
SELECT * FROM test1;
195-
a | b
196-
---+---------------------------------
197-
1 | "a"=>"1", "b"=>"boo", "c"=>NULL
198-
(1 row)
199-
200-
DROP TABLE test1;
201-
DROP FUNCTION test1(hstore);
202-
DROP FUNCTION test1none(hstore);
203-
DROP FUNCTION test1list(hstore);
204-
DROP FUNCTION test1arr(hstore[]);
20544
DROP FUNCTION test2();
20645
DROP FUNCTION test2arr();
207-
DROP FUNCTION test3();
208-
DROP FUNCTION test4();
20946
DROP EXTENSION hstore_plperl;
210-
DROP EXTENSION hstore_plperlu;
21147
DROP EXTENSION hstore;
21248
DROP EXTENSION plperl;
213-
DROP EXTENSION plperlu;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
CREATE EXTENSION hstore;
2+
CREATE EXTENSION plperlu;
3+
CREATE EXTENSION hstore_plperlu;
4+
SELECT transforms.udt_schema, transforms.udt_name,
5+
routine_schema, routine_name,
6+
group_name, transform_type
7+
FROM information_schema.transforms JOIN information_schema.routines
8+
USING (specific_catalog, specific_schema, specific_name)
9+
ORDER BY 1, 2, 5, 6;
10+
udt_schema | udt_name | routine_schema | routine_name | group_name | transform_type
11+
------------+----------+----------------+-------------------+------------+----------------
12+
public | hstore | public | hstore_to_plperlu | plperlu | FROM SQL
13+
public | hstore | public | plperlu_to_hstore | plperlu | TO SQL
14+
(2 rows)
15+
16+
-- test hstore -> perl
17+
CREATE FUNCTION test1(val hstore) RETURNS int
18+
LANGUAGE plperlu
19+
TRANSFORM FOR TYPE hstore
20+
AS $$
21+
use Data::Dumper;
22+
$Data::Dumper::Sortkeys = 1;
23+
elog(INFO, Dumper($_[0]));
24+
return scalar(keys %{$_[0]});
25+
$$;
26+
SELECT test1('aa=>bb, cc=>NULL'::hstore);
27+
INFO: $VAR1 = {
28+
'aa' => 'bb',
29+
'cc' => undef
30+
};
31+
32+
CONTEXT: PL/Perl function "test1"
33+
test1
34+
-------
35+
2
36+
(1 row)
37+
38+
CREATE FUNCTION test1none(val hstore) RETURNS int
39+
LANGUAGE plperlu
40+
AS $$
41+
use Data::Dumper;
42+
$Data::Dumper::Sortkeys = 1;
43+
elog(INFO, Dumper($_[0]));
44+
return scalar(keys %{$_[0]});
45+
$$;
46+
SELECT test1none('aa=>bb, cc=>NULL'::hstore);
47+
INFO: $VAR1 = '"aa"=>"bb", "cc"=>NULL';
48+
49+
CONTEXT: PL/Perl function "test1none"
50+
test1none
51+
-----------
52+
0
53+
(1 row)
54+
55+
CREATE FUNCTION test1list(val hstore) RETURNS int
56+
LANGUAGE plperlu
57+
TRANSFORM FOR TYPE hstore
58+
AS $$
59+
use Data::Dumper;
60+
$Data::Dumper::Sortkeys = 1;
61+
elog(INFO, Dumper($_[0]));
62+
return scalar(keys %{$_[0]});
63+
$$;
64+
SELECT test1list('aa=>bb, cc=>NULL'::hstore);
65+
INFO: $VAR1 = {
66+
'aa' => 'bb',
67+
'cc' => undef
68+
};
69+
70+
CONTEXT: PL/Perl function "test1list"
71+
test1list
72+
-----------
73+
2
74+
(1 row)
75+
76+
-- test hstore[] -> perl
77+
CREATE FUNCTION test1arr(val hstore[]) RETURNS int
78+
LANGUAGE plperlu
79+
TRANSFORM FOR TYPE hstore
80+
AS $$
81+
use Data::Dumper;
82+
$Data::Dumper::Sortkeys = 1;
83+
elog(INFO, Dumper($_[0]->[0], $_[0]->[1]));
84+
return scalar(keys %{$_[0]});
85+
$$;
86+
SELECT test1arr(array['aa=>bb, cc=>NULL'::hstore, 'dd=>ee']);
87+
INFO: $VAR1 = {
88+
'aa' => 'bb',
89+
'cc' => undef
90+
};
91+
$VAR2 = {
92+
'dd' => 'ee'
93+
};
94+
95+
CONTEXT: PL/Perl function "test1arr"
96+
test1arr
97+
----------
98+
2
99+
(1 row)
100+
101+
-- test as part of prepare/execute
102+
CREATE FUNCTION test3() RETURNS void
103+
LANGUAGE plperlu
104+
TRANSFORM FOR TYPE hstore
105+
AS $$
106+
use Data::Dumper;
107+
$Data::Dumper::Sortkeys = 1;
108+
109+
$rv = spi_exec_query(q{SELECT 'aa=>bb, cc=>NULL'::hstore AS col1});
110+
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
111+
112+
$val = {a => 1, b => 'boo', c => undef};
113+
$plan = spi_prepare(q{SELECT $1::text AS col1}, "hstore");
114+
$rv = spi_exec_prepared($plan, {}, $val);
115+
elog(INFO, Dumper($rv->{rows}[0]->{col1}));
116+
$$;
117+
SELECT test3();
118+
INFO: $VAR1 = {
119+
'aa' => 'bb',
120+
'cc' => undef
121+
};
122+
123+
CONTEXT: PL/Perl function "test3"
124+
INFO: $VAR1 = '"a"=>"1", "b"=>"boo", "c"=>NULL';
125+
126+
CONTEXT: PL/Perl function "test3"
127+
test3
128+
-------
129+
130+
(1 row)
131+
132+
-- test trigger
133+
CREATE TABLE test1 (a int, b hstore);
134+
INSERT INTO test1 VALUES (1, 'aa=>bb, cc=>NULL');
135+
SELECT * FROM test1;
136+
a | b
137+
---+------------------------
138+
1 | "aa"=>"bb", "cc"=>NULL
139+
(1 row)
140+
141+
CREATE FUNCTION test4() RETURNS trigger
142+
LANGUAGE plperlu
143+
TRANSFORM FOR TYPE hstore
144+
AS $$
145+
use Data::Dumper;
146+
$Data::Dumper::Sortkeys = 1;
147+
elog(INFO, Dumper($_TD->{new}));
148+
if ($_TD->{new}{a} == 1) {
149+
$_TD->{new}{b} = {a => 1, b => 'boo', c => undef};
150+
}
151+
152+
return "MODIFY";
153+
$$;
154+
CREATE TRIGGER test4 BEFORE UPDATE ON test1 FOR EACH ROW EXECUTE PROCEDURE test4();
155+
UPDATE test1 SET a = a;
156+
INFO: $VAR1 = {
157+
'a' => '1',
158+
'b' => {
159+
'aa' => 'bb',
160+
'cc' => undef
161+
}
162+
};
163+
164+
CONTEXT: PL/Perl function "test4"
165+
SELECT * FROM test1;
166+
a | b
167+
---+---------------------------------
168+
1 | "a"=>"1", "b"=>"boo", "c"=>NULL
169+
(1 row)
170+
171+
DROP TABLE test1;
172+
DROP FUNCTION test1(hstore);
173+
DROP FUNCTION test1none(hstore);
174+
DROP FUNCTION test1list(hstore);
175+
DROP FUNCTION test1arr(hstore[]);
176+
DROP FUNCTION test3();
177+
DROP FUNCTION test4();
178+
DROP EXTENSION hstore_plperlu;
179+
DROP EXTENSION hstore;
180+
DROP EXTENSION plperlu;

0 commit comments

Comments
 (0)