|
| 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