2
-- checkpoint so that if we have a crash in the tests, replay of the
3
-- just-completed CREATE DATABASE won't discard the core dump file
8
-- Test result value processing
11
CREATE OR REPLACE FUNCTION perl_int(int) RETURNS INTEGER AS $$
16
SELECT * FROM perl_int(42);
18
CREATE OR REPLACE FUNCTION perl_int(int) RETURNS INTEGER AS $$
23
SELECT * FROM perl_int(42);
26
CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$
30
SELECT perl_set_int(5);
31
SELECT * FROM perl_set_int(5);
33
CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$
37
SELECT perl_set_int(5);
38
SELECT * FROM perl_set_int(5);
41
CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text);
43
CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
48
SELECT * FROM perl_row();
50
CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
51
return {f2 => 'hello', f1 => 1, f3 => 'world'};
55
SELECT * FROM perl_row();
58
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
63
SELECT * FROM perl_set();
65
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
67
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
69
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
74
SELECT * FROM perl_set();
76
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
78
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
79
{ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' },
80
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
85
SELECT * FROM perl_set();
89
CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
94
SELECT * FROM perl_record();
95
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
97
CREATE OR REPLACE FUNCTION perl_record() RETURNS record AS $$
98
return {f2 => 'hello', f1 => 1, f3 => 'world'};
101
SELECT perl_record();
102
SELECT * FROM perl_record();
103
SELECT * FROM perl_record() AS (f1 integer, f2 text, f3 text);
106
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
110
SELECT perl_record_set();
111
SELECT * FROM perl_record_set();
112
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
114
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
116
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
118
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
122
SELECT perl_record_set();
123
SELECT * FROM perl_record_set();
124
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
126
CREATE OR REPLACE FUNCTION perl_record_set() RETURNS SETOF record AS $$
128
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
129
{ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' },
130
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
134
SELECT perl_record_set();
135
SELECT * FROM perl_record_set();
136
SELECT * FROM perl_record_set() AS (f1 integer, f2 text, f3 text);
139
-- Check behavior with erroneous return values
142
CREATE TYPE footype AS (x INTEGER, y INTEGER);
144
CREATE OR REPLACE FUNCTION foo_good() RETURNS SETOF footype AS $$
151
SELECT * FROM foo_good();
153
CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
154
return {y => 3, z => 4};
157
SELECT * FROM foo_bad();
159
CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
163
SELECT * FROM foo_bad();
165
CREATE OR REPLACE FUNCTION foo_bad() RETURNS footype AS $$
172
SELECT * FROM foo_bad();
174
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
178
SELECT * FROM foo_set_bad();
180
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
181
return {y => 3, z => 4};
184
SELECT * FROM foo_set_bad();
186
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
193
SELECT * FROM foo_set_bad();
195
CREATE OR REPLACE FUNCTION foo_set_bad() RETURNS SETOF footype AS $$
201
SELECT * FROM foo_set_bad();
204
-- Check passing a tuple argument
207
CREATE OR REPLACE FUNCTION perl_get_field(footype, text) RETURNS integer AS $$
208
return $_[0]->{$_[1]};
211
SELECT perl_get_field((11,12), 'x');
212
SELECT perl_get_field((11,12), 'y');
213
SELECT perl_get_field((11,12), 'z');