Fix xslt_process() to ensure that it inserts a NULL terminator after the
[PostgreSQL.git] / src / pl / plperl / expected / plperl.out
blobe1b0c75108fa26edda154cc0e21501808ea6b512
1 --
2 -- Test result value processing
3 --
4 CREATE OR REPLACE FUNCTION perl_int(int) RETURNS INTEGER AS $$
5 return undef;
6 $$ LANGUAGE plperl;
7 SELECT perl_int(11);
8  perl_int 
9 ----------
10          
11 (1 row)
13 SELECT * FROM perl_int(42);
14  perl_int 
15 ----------
16          
17 (1 row)
19 CREATE OR REPLACE FUNCTION perl_int(int) RETURNS INTEGER AS $$
20 return $_[0] + 1;
21 $$ LANGUAGE plperl;
22 SELECT perl_int(11);
23  perl_int 
24 ----------
25        12
26 (1 row)
28 SELECT * FROM perl_int(42);
29  perl_int 
30 ----------
31        43
32 (1 row)
34 CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$
35 return undef;
36 $$ LANGUAGE plperl;
37 SELECT perl_set_int(5);
38  perl_set_int 
39 --------------
40 (0 rows)
42 SELECT * FROM perl_set_int(5);
43  perl_set_int 
44 --------------
45 (0 rows)
47 CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$
48 return [0..$_[0]];
49 $$ LANGUAGE plperl;
50 SELECT perl_set_int(5);
51  perl_set_int 
52 --------------
53             0
54             1
55             2
56             3
57             4
58             5
59 (6 rows)
61 SELECT * FROM perl_set_int(5);
62  perl_set_int 
63 --------------
64             0
65             1
66             2
67             3
68             4
69             5
70 (6 rows)
72 CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text);
73 CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
74     return undef;
75 $$ LANGUAGE plperl;
76 SELECT perl_row();
77  perl_row 
78 ----------
80 (1 row)
82 SELECT * FROM perl_row();
83  f1 | f2 | f3 
84 ----+----+----
85     |    | 
86 (1 row)
88 CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
89     return {f2 => 'hello', f1 => 1, f3 => 'world'};
90 $$ LANGUAGE plperl;
91 SELECT perl_row();
92     perl_row     
93 -----------------
94  (1,hello,world)
95 (1 row)
97 SELECT * FROM perl_row();
98  f1 |  f2   |  f3   
99 ----+-------+-------
100   1 | hello | world
101 (1 row)
103 CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
104     return undef;
105 $$  LANGUAGE plperl;
106 SELECT perl_set();
107  perl_set 
108 ----------
109 (0 rows)
111 SELECT * FROM perl_set();
112  f1 | f2 | f3 
113 ----+----+----
114 (0 rows)
116 CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
117     return [
118         { f1 => 1, f2 => 'Hello', f3 =>  'World' },
119         undef,
120         { f1 => 3, f2 => 'Hello', f3 =>  'PL/Perl' }
121     ];
122 $$  LANGUAGE plperl;
123 SELECT perl_set();
124 ERROR:  SETOF-composite-returning PL/Perl function must call return_next with reference to hash
125 SELECT * FROM perl_set();
126 ERROR:  SETOF-composite-returning PL/Perl function must call return_next with reference to hash
127 CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
128     return [
129         { f1 => 1, f2 => 'Hello', f3 =>  'World' },
130         { f1 => 2, f2 => 'Hello', f3 =>  'PostgreSQL' },
131         { f1 => 3, f2 => 'Hello', f3 =>  'PL/Perl' }
132     ];
133 $$  LANGUAGE plperl;
134 SELECT perl_set();
135        perl_set       
136 ----------------------
137  (1,Hello,World)
138  (2,Hello,PostgreSQL)
139  (3,Hello,PL/Perl)
140 (3 rows)
142 SELECT * FROM perl_set();
143  f1 |  f2   |     f3     
144 ----+-------+------------
145   1 | Hello | World
146   2 | Hello | PostgreSQL
147   3 | Hello | PL/Perl
148 (3 rows)
150 CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
151     return undef;
152 $$ LANGUAGE plperl;
153 SELECT perl_record();
154  perl_record 
155 -------------
157 (1 row)
159 SELECT * FROM perl_record();
160 ERROR:  a column definition list is required for functions returning "record"
161 LINE 1: SELECT * FROM perl_record();
162                       ^
163 SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
164  f1 | f2 | f3 
165 ----+----+----
166     |    | 
167 (1 row)
169 CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
170     return {f2 => 'hello', f1 => 1, f3 => 'world'};
171 $$ LANGUAGE plperl;
172 SELECT perl_record();
173 ERROR:  function returning record called in context that cannot accept type record
174 SELECT * FROM perl_record();
175 ERROR:  a column definition list is required for functions returning "record"
176 LINE 1: SELECT * FROM perl_record();
177                       ^
178 SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
179  f1 |  f2   |  f3   
180 ----+-------+-------
181   1 | hello | world
182 (1 row)
184 CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
185     return undef;
186 $$  LANGUAGE plperl;
187 SELECT perl_record_set();
188 ERROR:  set-valued function called in context that cannot accept a set
189 SELECT * FROM perl_record_set();
190 ERROR:  a column definition list is required for functions returning "record"
191 LINE 1: SELECT * FROM perl_record_set();
192                       ^
193 SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
194  f1 | f2 | f3 
195 ----+----+----
196 (0 rows)
198 CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
199     return [
200         { f1 => 1, f2 => 'Hello', f3 =>  'World' },
201         undef,
202         { f1 => 3, f2 => 'Hello', f3 =>  'PL/Perl' }
203     ];
204 $$  LANGUAGE plperl;
205 SELECT perl_record_set();
206 ERROR:  set-valued function called in context that cannot accept a set
207 SELECT * FROM perl_record_set();
208 ERROR:  a column definition list is required for functions returning "record"
209 LINE 1: SELECT * FROM perl_record_set();
210                       ^
211 SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
212 ERROR:  SETOF-composite-returning PL/Perl function must call return_next with reference to hash
213 CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
214     return [
215         { f1 => 1, f2 => 'Hello', f3 =>  'World' },
216         { f1 => 2, f2 => 'Hello', f3 =>  'PostgreSQL' },
217         { f1 => 3, f2 => 'Hello', f3 =>  'PL/Perl' }
218     ];
219 $$  LANGUAGE plperl;
220 SELECT perl_record_set();
221 ERROR:  set-valued function called in context that cannot accept a set
222 SELECT * FROM perl_record_set();
223 ERROR:  a column definition list is required for functions returning "record"
224 LINE 1: SELECT * FROM perl_record_set();
225                       ^
226 SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
227  f1 |  f2   |     f3     
228 ----+-------+------------
229   1 | Hello | World
230   2 | Hello | PostgreSQL
231   3 | Hello | PL/Perl
232 (3 rows)
234 CREATE OR REPLACE FUNCTION
235 perl_out_params(f1 out integer, f2 out text, f3 out text) AS $$
236     return {f2 => 'hello', f1 => 1, f3 => 'world'};
237 $$ LANGUAGE plperl;
238 SELECT perl_out_params();
239  perl_out_params 
240 -----------------
241  (1,hello,world)
242 (1 row)
244 SELECT * FROM perl_out_params();
245  f1 |  f2   |  f3   
246 ----+-------+-------
247   1 | hello | world
248 (1 row)
250 SELECT (perl_out_params()).f2;
251   f2   
252 -------
253  hello
254 (1 row)
256 CREATE OR REPLACE FUNCTION
257 perl_out_params_set(out f1 integer, out f2 text, out f3 text)
258 RETURNS SETOF record AS $$
259     return [
260         { f1 => 1, f2 => 'Hello', f3 =>  'World' },
261         { f1 => 2, f2 => 'Hello', f3 =>  'PostgreSQL' },
262         { f1 => 3, f2 => 'Hello', f3 =>  'PL/Perl' }
263     ];
264 $$  LANGUAGE plperl;
265 SELECT perl_out_params_set();
266  perl_out_params_set  
267 ----------------------
268  (1,Hello,World)
269  (2,Hello,PostgreSQL)
270  (3,Hello,PL/Perl)
271 (3 rows)
273 SELECT * FROM perl_out_params_set();
274  f1 |  f2   |     f3     
275 ----+-------+------------
276   1 | Hello | World
277   2 | Hello | PostgreSQL
278   3 | Hello | PL/Perl
279 (3 rows)
281 SELECT (perl_out_params_set()).f3;
282      f3     
283 ------------
284  World
285  PostgreSQL
286  PL/Perl
287 (3 rows)
290 -- Check behavior with erroneous return values
292 CREATE TYPE footype AS (x INTEGER, y INTEGER);
293 CREATE OR REPLACE FUNCTION foo_good() RETURNS SETOF footype AS $$
294 return [
295     {x => 1, y => 2},
296     {x => 3, y => 4}
298 $$ LANGUAGE plperl;
299 SELECT * FROM foo_good();
300  x | y 
301 ---+---
302  1 | 2
303  3 | 4
304 (2 rows)
306 CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
307     return {y => 3, z => 4};
308 $$ LANGUAGE plperl;
309 SELECT * FROM foo_bad();
310 ERROR:  Perl hash contains nonexistent column "z"
311 CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
312 return 42;
313 $$ LANGUAGE plperl;
314 SELECT * FROM foo_bad();
315 ERROR:  composite-returning PL/Perl function must return reference to hash
316 CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
317 return [
318     [1, 2],
319     [3, 4]
321 $$ LANGUAGE plperl;
322 SELECT * FROM foo_bad();
323 ERROR:  composite-returning PL/Perl function must return reference to hash
324 CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
325     return 42;
326 $$ LANGUAGE plperl;
327 SELECT * FROM foo_set_bad();
328 ERROR:  set-returning PL/Perl function must return reference to array or use return_next
329 CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
330     return {y => 3, z => 4};
331 $$ LANGUAGE plperl;
332 SELECT * FROM foo_set_bad();
333 ERROR:  set-returning PL/Perl function must return reference to array or use return_next
334 CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
335 return [
336     [1, 2],
337     [3, 4]
339 $$ LANGUAGE plperl;
340 SELECT * FROM foo_set_bad();
341 ERROR:  SETOF-composite-returning PL/Perl function must call return_next with reference to hash
342 CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
343 return [
344     {y => 3, z => 4}
346 $$ LANGUAGE plperl;
347 SELECT * FROM foo_set_bad();
348 ERROR:  Perl hash contains nonexistent column "z"
350 -- Check passing a tuple argument
352 CREATE OR REPLACE FUNCTION perl_get_field(footype, text) RETURNS integer AS $$
353     return $_[0]->{$_[1]};
354 $$ LANGUAGE plperl;
355 SELECT perl_get_field((11,12), 'x');
356  perl_get_field 
357 ----------------
358              11
359 (1 row)
361 SELECT perl_get_field((11,12), 'y');
362  perl_get_field 
363 ----------------
364              12
365 (1 row)
367 SELECT perl_get_field((11,12), 'z');
368  perl_get_field 
369 ----------------
370                
371 (1 row)
374 -- Test return_next
376 CREATE OR REPLACE FUNCTION perl_srf_rn() RETURNS SETOF RECORD AS $$
377 my $i = 0;
378 for ("World", "PostgreSQL", "PL/Perl") {
379     return_next({f1=>++$i, f2=>'Hello', f3=>$_});
381 return;
382 $$ language plperl;
383 SELECT * from perl_srf_rn() AS (f1 INTEGER, f2 TEXT, f3 TEXT);
384  f1 |  f2   |     f3     
385 ----+-------+------------
386   1 | Hello | World
387   2 | Hello | PostgreSQL
388   3 | Hello | PL/Perl
389 (3 rows)
392 -- Test spi_query/spi_fetchrow
394 CREATE OR REPLACE FUNCTION perl_spi_func() RETURNS SETOF INTEGER AS $$
395 my $x = spi_query("select 1 as a union select 2 as a");
396 while (defined (my $y = spi_fetchrow($x))) {
397     return_next($y->{a});
399 return;
400 $$ LANGUAGE plperl;
401 SELECT * from perl_spi_func();
402  perl_spi_func 
403 ---------------
404              1
405              2
406 (2 rows)
409 -- Test spi_fetchrow abort
411 CREATE OR REPLACE FUNCTION perl_spi_func2() RETURNS INTEGER AS $$
412 my $x = spi_query("select 1 as a union select 2 as a");
413 spi_cursor_close( $x);
414 return 0;
415 $$ LANGUAGE plperl;
416 SELECT * from perl_spi_func2();
417  perl_spi_func2 
418 ----------------
419               0
420 (1 row)
423 --- Test recursion via SPI
425 CREATE OR REPLACE FUNCTION recurse(i int) RETURNS SETOF TEXT LANGUAGE plperl
426 AS $$
428   my $i = shift;
429   foreach my $x (1..$i)
430   {
431     return_next "hello $x";
432   }
433   if ($i > 2)
434   {
435     my $z = $i-1;
436     my $cursor = spi_query("select * from recurse($z)");
437     while (defined(my $row = spi_fetchrow($cursor)))
438     {
439       return_next "recurse $i: $row->{recurse}";
440     }
441   }
442   return undef;
445 SELECT * FROM recurse(2);
446  recurse 
447 ---------
448  hello 1
449  hello 2
450 (2 rows)
452 SELECT * FROM recurse(3);
453       recurse       
454 --------------------
455  hello 1
456  hello 2
457  hello 3
458  recurse 3: hello 1
459  recurse 3: hello 2
460 (5 rows)
463 --- Test arrary return
465 CREATE OR REPLACE FUNCTION  array_of_text() RETURNS TEXT[][] 
466 LANGUAGE plperl as $$ 
467     return [['a"b',undef,'c,d'],['e\\f',undef,'g']]; 
469 SELECT array_of_text();
470              array_of_text             
471 ---------------------------------------
472  {{"a\"b",NULL,"c,d"},{"e\\f",NULL,g}}
473 (1 row)
476 -- Test spi_prepare/spi_exec_prepared/spi_freeplan
478 CREATE OR REPLACE FUNCTION perl_spi_prepared(INTEGER) RETURNS INTEGER AS $$
479    my $x = spi_prepare('select $1 AS a', 'INTEGER');
480    my $q = spi_exec_prepared( $x, $_[0] + 1);
481    spi_freeplan($x);
482 return $q->{rows}->[0]->{a};
483 $$ LANGUAGE plperl;
484 SELECT * from perl_spi_prepared(42);
485  perl_spi_prepared 
486 -------------------
487                 43
488 (1 row)
491 -- Test spi_prepare/spi_query_prepared/spi_freeplan
493 CREATE OR REPLACE FUNCTION perl_spi_prepared_set(INTEGER, INTEGER) RETURNS SETOF INTEGER AS $$
494   my $x = spi_prepare('SELECT $1 AS a union select $2 as a', 'INT4', 'INT4');
495   my $q = spi_query_prepared( $x, 1+$_[0], 2+$_[1]);
496   while (defined (my $y = spi_fetchrow($q))) {
497       return_next $y->{a};
498   }
499   spi_freeplan($x);
500   return;
501 $$ LANGUAGE plperl;
502 SELECT * from perl_spi_prepared_set(1,2);
503  perl_spi_prepared_set 
504 -----------------------
505                      2
506                      4
507 (2 rows)
510 -- Test prepare with a type with spaces
512 CREATE OR REPLACE FUNCTION perl_spi_prepared_double(double precision) RETURNS double precision AS $$
513   my $x = spi_prepare('SELECT 10.0 * $1 AS a', 'DOUBLE PRECISION');
514   my $q = spi_query_prepared($x,$_[0]);
515   my $result;
516   while (defined (my $y = spi_fetchrow($q))) {
517       $result = $y->{a};
518   }
519   spi_freeplan($x);
520   return $result;
521 $$ LANGUAGE plperl;
522 SELECT perl_spi_prepared_double(4.35) as "double precision";
523  double precision 
524 ------------------
525              43.5
526 (1 row)
529 -- Test with a bad type
531 CREATE OR REPLACE FUNCTION perl_spi_prepared_bad(double precision) RETURNS double precision AS $$
532   my $x = spi_prepare('SELECT 10.0 * $1 AS a', 'does_not_exist');
533   my $q = spi_query_prepared($x,$_[0]);
534   my $result;
535   while (defined (my $y = spi_fetchrow($q))) {
536       $result = $y->{a};
537   }
538   spi_freeplan($x);
539   return $result;
540 $$ LANGUAGE plperl;
541 SELECT perl_spi_prepared_bad(4.35) as "double precision";
542 ERROR:  error from Perl function "perl_spi_prepared_bad": type "does_not_exist" does not exist at line 2.