|
| 1 | +CREATE EXTENSION hstore; |
| 2 | +CREATE EXTENSION plperl; |
1 | 3 | CREATE EXTENSION hstore_plperl; |
2 | | -CREATE EXTENSION hstore_plperlu; |
3 | 4 | SELECT transforms.udt_schema, transforms.udt_name, |
4 | 5 | routine_schema, routine_name, |
5 | 6 | group_name, transform_type |
6 | 7 | FROM information_schema.transforms JOIN information_schema.routines |
7 | 8 | USING (specific_catalog, specific_schema, specific_name) |
8 | 9 | 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) |
101 | 15 |
|
102 | 16 | -- test perl -> hstore |
103 | 17 | CREATE FUNCTION test2() RETURNS hstore |
@@ -127,87 +41,8 @@ SELECT test2arr(); |
127 | 41 | {"\"a\"=>\"1\", \"b\"=>\"boo\", \"c\"=>NULL","\"d\"=>\"2\""} |
128 | 42 | (1 row) |
129 | 43 |
|
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[]); |
205 | 44 | DROP FUNCTION test2(); |
206 | 45 | DROP FUNCTION test2arr(); |
207 | | -DROP FUNCTION test3(); |
208 | | -DROP FUNCTION test4(); |
209 | 46 | DROP EXTENSION hstore_plperl; |
210 | | -DROP EXTENSION hstore_plperlu; |
211 | 47 | DROP EXTENSION hstore; |
212 | 48 | DROP EXTENSION plperl; |
213 | | -DROP EXTENSION plperlu; |
0 commit comments