Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 1858b10

Browse files
committed
Add tests for COPY in PL/pgSQL
This stresses the error handling of COPY inside SPI which does not support the operation using stdin or stdout, and these scenarios were not tested up to now. Author: Mark Dilger Discussion: https://postgr.es/m/a6e9b130-7fd5-387b-4ec5-89bda24373ab@gmail.com
1 parent aae5023 commit 1858b10

File tree

6 files changed

+158
-2
lines changed

6 files changed

+158
-2
lines changed

src/pl/plpgsql/src/Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ DATA = plpgsql.control plpgsql--1.0.sql plpgsql--unpackaged--1.0.sql
3232

3333
REGRESS_OPTS = --dbname=$(PL_TESTDB)
3434

35-
REGRESS = plpgsql_call plpgsql_control plpgsql_domain plpgsql_record \
36-
plpgsql_cache plpgsql_transaction plpgsql_trap \
35+
REGRESS = plpgsql_call plpgsql_control plpgsql_copy plpgsql_domain \
36+
plpgsql_record plpgsql_cache plpgsql_transaction plpgsql_trap \
3737
plpgsql_trigger plpgsql_varprops
3838

3939
# where to find gen_keywordlist.pl and subsidiary files

src/pl/plpgsql/src/data/copy1.data

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1 1.1
2+
2 2.2
3+
3 3.3
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/plpgsql_copy.out
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
CREATE TABLE copy1 (a int, b float);
2+
3+
-- COPY TO/FROM not authorized from client.
4+
DO LANGUAGE plpgsql $$
5+
BEGIN
6+
COPY copy1 TO stdout;
7+
END;
8+
$$;
9+
DO LANGUAGE plpgsql $$
10+
BEGIN
11+
COPY copy1 FROM stdin;
12+
END;
13+
$$;
14+
DO LANGUAGE plpgsql $$
15+
BEGIN
16+
EXECUTE 'COPY copy1 TO stdout';
17+
END;
18+
$$;
19+
DO LANGUAGE plpgsql $$
20+
BEGIN
21+
EXECUTE 'COPY copy1 FROM stdin';
22+
END;
23+
$$;
24+
25+
-- Valid cases
26+
-- COPY FROM
27+
DO LANGUAGE plpgsql $$
28+
BEGIN
29+
COPY copy1 FROM '@abs_srcdir@/data/copy1.data';
30+
END;
31+
$$;
32+
SELECT * FROM copy1 ORDER BY 1;
33+
TRUNCATE copy1;
34+
DO LANGUAGE plpgsql $$
35+
BEGIN
36+
EXECUTE 'COPY copy1 FROM ''@abs_srcdir@/data/copy1.data''';
37+
END;
38+
$$;
39+
SELECT * FROM copy1 ORDER BY 1;
40+
41+
-- COPY TO
42+
-- Copy the data externally once, then process it back to the table.
43+
DO LANGUAGE plpgsql $$
44+
BEGIN
45+
COPY copy1 TO '@abs_builddir@/results/copy1.data';
46+
END;
47+
$$;
48+
TRUNCATE copy1;
49+
DO LANGUAGE plpgsql $$
50+
BEGIN
51+
COPY copy1 FROM '@abs_builddir@/results/copy1.data';
52+
END;
53+
$$;
54+
DO LANGUAGE plpgsql $$
55+
BEGIN
56+
EXECUTE 'COPY copy1 FROM ''@abs_builddir@/results/copy1.data''';
57+
END;
58+
$$;
59+
60+
SELECT * FROM copy1 ORDER BY 1;
61+
62+
DROP TABLE copy1;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
CREATE TABLE copy1 (a int, b float);
2+
-- COPY TO/FROM not authorized from client.
3+
DO LANGUAGE plpgsql $$
4+
BEGIN
5+
COPY copy1 TO stdout;
6+
END;
7+
$$;
8+
ERROR: cannot COPY to/from client in PL/pgSQL
9+
CONTEXT: PL/pgSQL function inline_code_block line 3 at SQL statement
10+
DO LANGUAGE plpgsql $$
11+
BEGIN
12+
COPY copy1 FROM stdin;
13+
END;
14+
$$;
15+
ERROR: cannot COPY to/from client in PL/pgSQL
16+
CONTEXT: PL/pgSQL function inline_code_block line 3 at SQL statement
17+
DO LANGUAGE plpgsql $$
18+
BEGIN
19+
EXECUTE 'COPY copy1 TO stdout';
20+
END;
21+
$$;
22+
ERROR: cannot COPY to/from client in PL/pgSQL
23+
CONTEXT: PL/pgSQL function inline_code_block line 3 at EXECUTE
24+
DO LANGUAGE plpgsql $$
25+
BEGIN
26+
EXECUTE 'COPY copy1 FROM stdin';
27+
END;
28+
$$;
29+
ERROR: cannot COPY to/from client in PL/pgSQL
30+
CONTEXT: PL/pgSQL function inline_code_block line 3 at EXECUTE
31+
-- Valid cases
32+
-- COPY FROM
33+
DO LANGUAGE plpgsql $$
34+
BEGIN
35+
COPY copy1 FROM '@abs_builddir@/data/copy1.data';
36+
END;
37+
$$;
38+
SELECT * FROM copy1 ORDER BY 1;
39+
a | b
40+
---+-----
41+
1 | 1.1
42+
2 | 2.2
43+
3 | 3.3
44+
(3 rows)
45+
46+
TRUNCATE copy1;
47+
DO LANGUAGE plpgsql $$
48+
BEGIN
49+
EXECUTE 'COPY copy1 FROM ''@abs_builddir@/data/copy1.data''';
50+
END;
51+
$$;
52+
SELECT * FROM copy1 ORDER BY 1;
53+
a | b
54+
---+-----
55+
1 | 1.1
56+
2 | 2.2
57+
3 | 3.3
58+
(3 rows)
59+
60+
-- COPY TO
61+
-- Copy the data externally once, then process it back to the table.
62+
DO LANGUAGE plpgsql $$
63+
BEGIN
64+
COPY copy1 TO '@abs_builddir@/results/copy1.data';
65+
END;
66+
$$;
67+
TRUNCATE copy1;
68+
DO LANGUAGE plpgsql $$
69+
BEGIN
70+
COPY copy1 FROM '@abs_builddir@/results/copy1.data';
71+
END;
72+
$$;
73+
DO LANGUAGE plpgsql $$
74+
BEGIN
75+
EXECUTE 'COPY copy1 FROM ''@abs_builddir@/results/copy1.data''';
76+
END;
77+
$$;
78+
SELECT * FROM copy1 ORDER BY 1;
79+
a | b
80+
---+-----
81+
1 | 1.1
82+
1 | 1.1
83+
2 | 2.2
84+
2 | 2.2
85+
3 | 3.3
86+
3 | 3.3
87+
(6 rows)
88+
89+
DROP TABLE copy1;

src/pl/plpgsql/src/sql/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/plpgsql_copy.sql

0 commit comments

Comments
 (0)