@@ -69,7 +69,8 @@ SELECT * FROM perl_set_int(5);
69
69
5
70
70
(6 rows)
71
71
72
- CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text);
72
+ CREATE TYPE testnestperl AS (f5 integer[]);
73
+ CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text, f4 testnestperl);
73
74
CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
74
75
return undef;
75
76
$$ LANGUAGE plperl;
@@ -80,24 +81,24 @@ SELECT perl_row();
80
81
(1 row)
81
82
82
83
SELECT * FROM perl_row();
83
- f1 | f2 | f3
84
- ----+----+----
85
- | |
84
+ f1 | f2 | f3 | f4
85
+ ----+----+----+----
86
+ | | |
86
87
(1 row)
87
88
88
89
CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
89
- return {f2 => 'hello', f1 => 1, f3 => 'world'};
90
+ return {f2 => 'hello', f1 => 1, f3 => 'world', 'f4' => { 'f5' => [[1]] } };
90
91
$$ LANGUAGE plperl;
91
92
SELECT perl_row();
92
- perl_row
93
- -----------------
94
- (1,hello,world)
93
+ perl_row
94
+ ---------------------------
95
+ (1,hello,world,"({{1}})" )
95
96
(1 row)
96
97
97
98
SELECT * FROM perl_row();
98
- f1 | f2 | f3
99
- ----+-------+-------
100
- 1 | hello | world
99
+ f1 | f2 | f3 | f4
100
+ ----+-------+-------+---------
101
+ 1 | hello | world | ({{1}})
101
102
(1 row)
102
103
103
104
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
@@ -109,15 +110,18 @@ SELECT perl_set();
109
110
(0 rows)
110
111
111
112
SELECT * FROM perl_set();
112
- f1 | f2 | f3
113
- ----+----+----
113
+ f1 | f2 | f3 | f4
114
+ ----+----+----+----
114
115
(0 rows)
115
116
116
117
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
117
118
return [
118
119
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
119
120
undef,
120
- { f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
121
+ { f1 => 3, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => {} },
122
+ { f1 => 4, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => undef }},
123
+ { f1 => 5, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => '{1}' }},
124
+ { f1 => 6, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => [1] }},
121
125
];
122
126
$$ LANGUAGE plperl;
123
127
SELECT perl_set();
@@ -129,25 +133,37 @@ CONTEXT: PL/Perl function "perl_set"
129
133
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
130
134
return [
131
135
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
132
- { f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' },
133
- { f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
136
+ { f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL', 'f4' => undef },
137
+ { f1 => 3, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => {} },
138
+ { f1 => 4, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => undef }},
139
+ { f1 => 5, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => '{1}' }},
140
+ { f1 => 6, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => { 'f5' => [1] }},
141
+ { f1 => 7, f2 => 'Hello', f3 => 'PL/Perl', 'f4' => '({1})' },
134
142
];
135
143
$$ LANGUAGE plperl;
136
144
SELECT perl_set();
137
- perl_set
138
- ----------------------
139
- (1,Hello,World)
140
- (2,Hello,PostgreSQL)
141
- (3,Hello,PL/Perl)
142
- (3 rows)
145
+ perl_set
146
+ ---------------------------
147
+ (1,Hello,World,)
148
+ (2,Hello,PostgreSQL,)
149
+ (3,Hello,PL/Perl,"()")
150
+ (4,Hello,PL/Perl,"()")
151
+ (5,Hello,PL/Perl,"({1})")
152
+ (6,Hello,PL/Perl,"({1})")
153
+ (7,Hello,PL/Perl,"({1})")
154
+ (7 rows)
143
155
144
156
SELECT * FROM perl_set();
145
- f1 | f2 | f3
146
- ----+-------+------------
147
- 1 | Hello | World
148
- 2 | Hello | PostgreSQL
149
- 3 | Hello | PL/Perl
150
- (3 rows)
157
+ f1 | f2 | f3 | f4
158
+ ----+-------+------------+-------
159
+ 1 | Hello | World |
160
+ 2 | Hello | PostgreSQL |
161
+ 3 | Hello | PL/Perl | ()
162
+ 4 | Hello | PL/Perl | ()
163
+ 5 | Hello | PL/Perl | ({1})
164
+ 6 | Hello | PL/Perl | ({1})
165
+ 7 | Hello | PL/Perl | ({1})
166
+ (7 rows)
151
167
152
168
CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
153
169
return undef;
@@ -162,14 +178,14 @@ SELECT * FROM perl_record();
162
178
ERROR: a column definition list is required for functions returning "record"
163
179
LINE 1: SELECT * FROM perl_record();
164
180
^
165
- SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
166
- f1 | f2 | f3
167
- ----+----+----
168
- | |
181
+ SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text, f4 testnestperl );
182
+ f1 | f2 | f3 | f4
183
+ ----+----+----+----
184
+ | | |
169
185
(1 row)
170
186
171
187
CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
172
- return {f2 => 'hello', f1 => 1, f3 => 'world'};
188
+ return {f2 => 'hello', f1 => 1, f3 => 'world', 'f4' => { 'f5' => [1] } };
173
189
$$ LANGUAGE plperl;
174
190
SELECT perl_record();
175
191
ERROR: function returning record called in context that cannot accept type record
@@ -178,10 +194,10 @@ SELECT * FROM perl_record();
178
194
ERROR: a column definition list is required for functions returning "record"
179
195
LINE 1: SELECT * FROM perl_record();
180
196
^
181
- SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
182
- f1 | f2 | f3
183
- ----+-------+-------
184
- 1 | hello | world
197
+ SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text, f4 testnestperl );
198
+ f1 | f2 | f3 | f4
199
+ ----+-------+-------+-------
200
+ 1 | hello | world | ({1})
185
201
(1 row)
186
202
187
203
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
@@ -474,7 +490,7 @@ SELECT * FROM recurse(3);
474
490
(5 rows)
475
491
476
492
---
477
- --- Test arrary return
493
+ --- Test array return
478
494
---
479
495
CREATE OR REPLACE FUNCTION array_of_text() RETURNS TEXT[][]
480
496
LANGUAGE plperl as $$
@@ -555,6 +571,32 @@ $$ LANGUAGE plperl;
555
571
SELECT perl_spi_prepared_bad(4.35) as "double precision";
556
572
ERROR: type "does_not_exist" does not exist at line 2.
557
573
CONTEXT: PL/Perl function "perl_spi_prepared_bad"
574
+ -- Test with a row type
575
+ CREATE OR REPLACE FUNCTION perl_spi_prepared() RETURNS INTEGER AS $$
576
+ my $x = spi_prepare('select $1::footype AS a', 'footype');
577
+ my $q = spi_exec_prepared( $x, '(1, 2)');
578
+ spi_freeplan($x);
579
+ return $q->{rows}->[0]->{a}->{x};
580
+ $$ LANGUAGE plperl;
581
+ SELECT * from perl_spi_prepared();
582
+ perl_spi_prepared
583
+ -------------------
584
+ 1
585
+ (1 row)
586
+
587
+ CREATE OR REPLACE FUNCTION perl_spi_prepared_row(footype) RETURNS footype AS $$
588
+ my $footype = shift;
589
+ my $x = spi_prepare('select $1 AS a', 'footype');
590
+ my $q = spi_exec_prepared( $x, {}, $footype );
591
+ spi_freeplan($x);
592
+ return $q->{rows}->[0]->{a};
593
+ $$ LANGUAGE plperl;
594
+ SELECT * from perl_spi_prepared_row('(1, 2)');
595
+ x | y
596
+ ---+---
597
+ 1 | 2
598
+ (1 row)
599
+
558
600
-- simple test of a DO block
559
601
DO $$
560
602
$a = 'This is a test';
0 commit comments