PolarDB-for-PostgreSQL
218 строк · 9.1 Кб
1--
2-- Test foreign-data wrapper file_fdw.
3--
4
5-- Clean up in case a prior regression run failed
6SET client_min_messages TO 'warning';
7DROP ROLE IF EXISTS regress_file_fdw_superuser, regress_file_fdw_user, regress_no_priv_user;
8RESET client_min_messages;
9
10CREATE ROLE regress_file_fdw_superuser LOGIN SUPERUSER; -- is a superuser
11CREATE ROLE regress_file_fdw_user LOGIN; -- has priv and user mapping
12CREATE ROLE regress_no_priv_user LOGIN; -- has priv but no user mapping
13
14-- Install file_fdw
15CREATE EXTENSION file_fdw;
16
17-- regress_file_fdw_superuser owns fdw-related objects
18SET ROLE regress_file_fdw_superuser;
19CREATE SERVER file_server FOREIGN DATA WRAPPER file_fdw;
20
21-- privilege tests
22SET ROLE regress_file_fdw_user;
23CREATE FOREIGN DATA WRAPPER file_fdw2 HANDLER file_fdw_handler VALIDATOR file_fdw_validator; -- ERROR
24CREATE SERVER file_server2 FOREIGN DATA WRAPPER file_fdw; -- ERROR
25CREATE USER MAPPING FOR regress_file_fdw_user SERVER file_server; -- ERROR
26
27SET ROLE regress_file_fdw_superuser;
28GRANT USAGE ON FOREIGN SERVER file_server TO regress_file_fdw_user;
29
30SET ROLE regress_file_fdw_user;
31CREATE USER MAPPING FOR regress_file_fdw_user SERVER file_server;
32
33-- create user mappings and grant privilege to test users
34SET ROLE regress_file_fdw_superuser;
35CREATE USER MAPPING FOR regress_file_fdw_superuser SERVER file_server;
36CREATE USER MAPPING FOR regress_no_priv_user SERVER file_server;
37
38-- validator tests
39CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'xml'); -- ERROR
40CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', header 'true'); -- ERROR
41CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', quote ':'); -- ERROR
42CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', escape ':'); -- ERROR
43CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'binary', header 'true'); -- ERROR
44CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'binary', quote ':'); -- ERROR
45CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'binary', escape ':'); -- ERROR
46CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', delimiter 'a'); -- ERROR
47CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', escape '-'); -- ERROR
48CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', quote '-', null '=-='); -- ERROR
49CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', delimiter '-', null '=-='); -- ERROR
50CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', delimiter '-', quote '-'); -- ERROR
51CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', delimiter '---'); -- ERROR
52CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', quote '---'); -- ERROR
53CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', escape '---'); -- ERROR
54CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', delimiter '\'); -- ERROR
55CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', delimiter '.'); -- ERROR
56CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', delimiter '1'); -- ERROR
57CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', delimiter 'a'); -- ERROR
58CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', delimiter '
59'); -- ERROR
60CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', null '
61'); -- ERROR
62CREATE FOREIGN TABLE tbl () SERVER file_server; -- ERROR
63
64CREATE FOREIGN TABLE agg_text (
65a int2 CHECK (a >= 0),
66b float4
67) SERVER file_server
68OPTIONS (format 'text', filename '@abs_srcdir@/data/agg.data', delimiter ' ', null '\N');
69GRANT SELECT ON agg_text TO regress_file_fdw_user;
70CREATE FOREIGN TABLE agg_csv (
71a int2,
72b float4
73) SERVER file_server
74OPTIONS (format 'csv', filename '@abs_srcdir@/data/agg.csv', header 'true', delimiter ';', quote '@', escape '"', null '');
75ALTER FOREIGN TABLE agg_csv ADD CHECK (a >= 0);
76CREATE FOREIGN TABLE agg_bad (
77a int2,
78b float4
79) SERVER file_server
80OPTIONS (format 'csv', filename '@abs_srcdir@/data/agg.bad', header 'true', delimiter ';', quote '@', escape '"', null '');
81ALTER FOREIGN TABLE agg_bad ADD CHECK (a >= 0);
82
83-- per-column options tests
84CREATE FOREIGN TABLE text_csv (
85word1 text OPTIONS (force_not_null 'true'),
86word2 text OPTIONS (force_not_null 'off'),
87word3 text OPTIONS (force_null 'true'),
88word4 text OPTIONS (force_null 'off')
89) SERVER file_server
90OPTIONS (format 'text', filename '@abs_srcdir@/data/text.csv', null 'NULL');
91SELECT * FROM text_csv; -- ERROR
92ALTER FOREIGN TABLE text_csv OPTIONS (SET format 'csv');
93\pset null _null_
94SELECT * FROM text_csv;
95
96-- force_not_null and force_null can be used together on the same column
97ALTER FOREIGN TABLE text_csv ALTER COLUMN word1 OPTIONS (force_null 'true');
98ALTER FOREIGN TABLE text_csv ALTER COLUMN word3 OPTIONS (force_not_null 'true');
99
100-- force_not_null is not allowed to be specified at any foreign object level:
101ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_not_null '*'); -- ERROR
102ALTER SERVER file_server OPTIONS (ADD force_not_null '*'); -- ERROR
103CREATE USER MAPPING FOR public SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
104CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
105
106-- force_null is not allowed to be specified at any foreign object level:
107ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_null '*'); -- ERROR
108ALTER SERVER file_server OPTIONS (ADD force_null '*'); -- ERROR
109CREATE USER MAPPING FOR public SERVER file_server OPTIONS (force_null '*'); -- ERROR
110CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_null '*'); -- ERROR
111
112-- basic query tests
113SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a;
114SELECT * FROM agg_csv ORDER BY a;
115SELECT * FROM agg_csv c JOIN agg_text t ON (t.a = c.a) ORDER BY c.a;
116
117-- error context report tests
118SELECT * FROM agg_bad; -- ERROR
119
120-- misc query tests
121\t on
122EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM agg_csv;
123\t off
124PREPARE st(int) AS SELECT * FROM agg_csv WHERE a = $1;
125EXECUTE st(100);
126EXECUTE st(100);
127DEALLOCATE st;
128
129-- tableoid
130SELECT tableoid::regclass, b FROM agg_csv;
131
132-- updates aren't supported
133INSERT INTO agg_csv VALUES(1,2.0);
134UPDATE agg_csv SET a = 1;
135DELETE FROM agg_csv WHERE a = 100;
136-- but this should be allowed
137SELECT * FROM agg_csv FOR UPDATE;
138
139-- copy from isn't supported either
140COPY agg_csv FROM STDIN;
14112 3.4
142\.
143
144-- constraint exclusion tests
145\t on
146EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM agg_csv WHERE a < 0;
147\t off
148SELECT * FROM agg_csv WHERE a < 0;
149SET constraint_exclusion = 'on';
150\t on
151EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM agg_csv WHERE a < 0;
152\t off
153SELECT * FROM agg_csv WHERE a < 0;
154RESET constraint_exclusion;
155
156-- table inheritance tests
157CREATE TABLE agg (a int2, b float4);
158ALTER FOREIGN TABLE agg_csv INHERIT agg;
159SELECT tableoid::regclass, * FROM agg;
160SELECT tableoid::regclass, * FROM agg_csv;
161SELECT tableoid::regclass, * FROM ONLY agg;
162-- updates aren't supported
163UPDATE agg SET a = 1;
164DELETE FROM agg WHERE a = 100;
165-- but this should be allowed
166SELECT tableoid::regclass, * FROM agg FOR UPDATE;
167ALTER FOREIGN TABLE agg_csv NO INHERIT agg;
168DROP TABLE agg;
169
170-- declarative partitioning tests
171SET ROLE regress_file_fdw_superuser;
172CREATE TABLE pt (a int, b text) partition by list (a);
173CREATE FOREIGN TABLE p1 partition of pt for values in (1) SERVER file_server
174OPTIONS (format 'csv', filename '@abs_srcdir@/data/list1.csv', delimiter ',');
175CREATE TABLE p2 partition of pt for values in (2);
176SELECT tableoid::regclass, * FROM pt;
177SELECT tableoid::regclass, * FROM p1;
178SELECT tableoid::regclass, * FROM p2;
179COPY pt FROM '@abs_srcdir@/data/list2.bad' with (format 'csv', delimiter ','); -- ERROR
180COPY pt FROM '@abs_srcdir@/data/list2.csv' with (format 'csv', delimiter ',');
181SELECT tableoid::regclass, * FROM pt;
182SELECT tableoid::regclass, * FROM p1;
183SELECT tableoid::regclass, * FROM p2;
184INSERT INTO pt VALUES (1, 'xyzzy'); -- ERROR
185INSERT INTO pt VALUES (2, 'xyzzy');
186UPDATE pt set a = 1 where a = 2; -- ERROR
187SELECT tableoid::regclass, * FROM pt;
188SELECT tableoid::regclass, * FROM p1;
189SELECT tableoid::regclass, * FROM p2;
190DROP TABLE pt;
191
192-- privilege tests
193SET ROLE regress_file_fdw_superuser;
194SELECT * FROM agg_text ORDER BY a;
195SET ROLE regress_file_fdw_user;
196SELECT * FROM agg_text ORDER BY a;
197SET ROLE regress_no_priv_user;
198SELECT * FROM agg_text ORDER BY a; -- ERROR
199SET ROLE regress_file_fdw_user;
200\t on
201EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM agg_text WHERE a > 0;
202\t off
203-- file FDW allows foreign tables to be accessed without user mapping
204DROP USER MAPPING FOR regress_file_fdw_user SERVER file_server;
205SELECT * FROM agg_text ORDER BY a;
206
207-- privilege tests for object
208SET ROLE regress_file_fdw_superuser;
209ALTER FOREIGN TABLE agg_text OWNER TO regress_file_fdw_user;
210ALTER FOREIGN TABLE agg_text OPTIONS (SET format 'text');
211SET ROLE regress_file_fdw_user;
212ALTER FOREIGN TABLE agg_text OPTIONS (SET format 'text');
213SET ROLE regress_file_fdw_superuser;
214
215-- cleanup
216RESET ROLE;
217DROP EXTENSION file_fdw CASCADE;
218DROP ROLE regress_file_fdw_superuser, regress_file_fdw_user, regress_no_priv_user;
219