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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1 1.1
2+
2 2.2
3+
3 3.3
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/plpgsql_copy.out
Lines changed: 62 additions & 0 deletions
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;
Lines changed: 89 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/plpgsql_copy.sql

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy