PageRenderTime 46ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/src/test/regress/sql/foreign_data.sql

https://github.com/bbt123/postgres
SQL | 549 lines | 461 code | 59 blank | 29 comment | 0 complexity | 75a6cf5127d818f397971e362d76cbca MD5 | raw file
Possible License(s): AGPL-3.0
  1. --
  2. -- Test foreign-data wrapper and server management.
  3. --
  4. -- Clean up in case a prior regression run failed
  5. -- Suppress NOTICE messages when roles don't exist
  6. SET client_min_messages TO 'error';
  7. DROP ROLE IF EXISTS foreign_data_user, regress_test_role, regress_test_role2, regress_test_role_super, regress_test_indirect, unpriviled_role;
  8. RESET client_min_messages;
  9. CREATE ROLE foreign_data_user LOGIN SUPERUSER;
  10. SET SESSION AUTHORIZATION 'foreign_data_user';
  11. CREATE ROLE regress_test_role;
  12. CREATE ROLE regress_test_role2;
  13. CREATE ROLE regress_test_role_super SUPERUSER;
  14. CREATE ROLE regress_test_indirect;
  15. CREATE ROLE unprivileged_role;
  16. CREATE FOREIGN DATA WRAPPER dummy;
  17. COMMENT ON FOREIGN DATA WRAPPER dummy IS 'useless';
  18. CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;
  19. -- At this point we should have 2 built-in wrappers and no servers.
  20. SELECT fdwname, fdwhandler::regproc, fdwvalidator::regproc, fdwoptions FROM pg_foreign_data_wrapper ORDER BY 1, 2, 3;
  21. SELECT srvname, srvoptions FROM pg_foreign_server;
  22. SELECT * FROM pg_user_mapping;
  23. -- CREATE FOREIGN DATA WRAPPER
  24. CREATE FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR
  25. CREATE FOREIGN DATA WRAPPER foo;
  26. \dew
  27. CREATE FOREIGN DATA WRAPPER foo; -- duplicate
  28. DROP FOREIGN DATA WRAPPER foo;
  29. CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1');
  30. \dew+
  31. DROP FOREIGN DATA WRAPPER foo;
  32. CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', testing '2'); -- ERROR
  33. CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', another '2');
  34. \dew+
  35. DROP FOREIGN DATA WRAPPER foo;
  36. SET ROLE regress_test_role;
  37. CREATE FOREIGN DATA WRAPPER foo; -- ERROR
  38. RESET ROLE;
  39. CREATE FOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator;
  40. \dew+
  41. -- ALTER FOREIGN DATA WRAPPER
  42. ALTER FOREIGN DATA WRAPPER foo; -- ERROR
  43. ALTER FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR
  44. ALTER FOREIGN DATA WRAPPER foo NO VALIDATOR;
  45. \dew+
  46. ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '1', b '2');
  47. ALTER FOREIGN DATA WRAPPER foo OPTIONS (SET c '4'); -- ERROR
  48. ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP c); -- ERROR
  49. ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD x '1', DROP x);
  50. \dew+
  51. ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP a, SET b '3', ADD c '4');
  52. \dew+
  53. ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '2');
  54. ALTER FOREIGN DATA WRAPPER foo OPTIONS (b '4'); -- ERROR
  55. \dew+
  56. SET ROLE regress_test_role;
  57. ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); -- ERROR
  58. SET ROLE regress_test_role_super;
  59. ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5');
  60. \dew+
  61. ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role; -- ERROR
  62. ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role_super;
  63. ALTER ROLE regress_test_role_super NOSUPERUSER;
  64. SET ROLE regress_test_role_super;
  65. ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD e '6'); -- ERROR
  66. RESET ROLE;
  67. \dew+
  68. ALTER FOREIGN DATA WRAPPER foo RENAME TO foo1;
  69. \dew+
  70. ALTER FOREIGN DATA WRAPPER foo1 RENAME TO foo;
  71. -- DROP FOREIGN DATA WRAPPER
  72. DROP FOREIGN DATA WRAPPER nonexistent; -- ERROR
  73. DROP FOREIGN DATA WRAPPER IF EXISTS nonexistent;
  74. \dew+
  75. DROP ROLE regress_test_role_super; -- ERROR
  76. SET ROLE regress_test_role_super;
  77. DROP FOREIGN DATA WRAPPER foo;
  78. RESET ROLE;
  79. DROP ROLE regress_test_role_super;
  80. \dew+
  81. CREATE FOREIGN DATA WRAPPER foo;
  82. CREATE SERVER s1 FOREIGN DATA WRAPPER foo;
  83. COMMENT ON SERVER s1 IS 'foreign server';
  84. CREATE USER MAPPING FOR current_user SERVER s1;
  85. \dew+
  86. \des+
  87. \deu+
  88. DROP FOREIGN DATA WRAPPER foo; -- ERROR
  89. SET ROLE regress_test_role;
  90. DROP FOREIGN DATA WRAPPER foo CASCADE; -- ERROR
  91. RESET ROLE;
  92. DROP FOREIGN DATA WRAPPER foo CASCADE;
  93. \dew+
  94. \des+
  95. \deu+
  96. -- exercise CREATE SERVER
  97. CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR
  98. CREATE FOREIGN DATA WRAPPER foo OPTIONS ("test wrapper" 'true');
  99. CREATE SERVER s1 FOREIGN DATA WRAPPER foo;
  100. CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR
  101. CREATE SERVER s2 FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b');
  102. CREATE SERVER s3 TYPE 'oracle' FOREIGN DATA WRAPPER foo;
  103. CREATE SERVER s4 TYPE 'oracle' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b');
  104. CREATE SERVER s5 VERSION '15.0' FOREIGN DATA WRAPPER foo;
  105. CREATE SERVER s6 VERSION '16.0' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b');
  106. CREATE SERVER s7 TYPE 'oracle' VERSION '17.0' FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b');
  107. CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (foo '1'); -- ERROR
  108. CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (host 'localhost', dbname 's8db');
  109. \des+
  110. SET ROLE regress_test_role;
  111. CREATE SERVER t1 FOREIGN DATA WRAPPER foo; -- ERROR: no usage on FDW
  112. RESET ROLE;
  113. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role;
  114. SET ROLE regress_test_role;
  115. CREATE SERVER t1 FOREIGN DATA WRAPPER foo;
  116. RESET ROLE;
  117. \des+
  118. REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_test_role;
  119. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_indirect;
  120. SET ROLE regress_test_role;
  121. CREATE SERVER t2 FOREIGN DATA WRAPPER foo; -- ERROR
  122. RESET ROLE;
  123. GRANT regress_test_indirect TO regress_test_role;
  124. SET ROLE regress_test_role;
  125. CREATE SERVER t2 FOREIGN DATA WRAPPER foo;
  126. \des+
  127. RESET ROLE;
  128. REVOKE regress_test_indirect FROM regress_test_role;
  129. -- ALTER SERVER
  130. ALTER SERVER s0; -- ERROR
  131. ALTER SERVER s0 OPTIONS (a '1'); -- ERROR
  132. ALTER SERVER s1 VERSION '1.0' OPTIONS (servername 's1');
  133. ALTER SERVER s2 VERSION '1.1';
  134. ALTER SERVER s3 OPTIONS ("tns name" 'orcl', port '1521');
  135. GRANT USAGE ON FOREIGN SERVER s1 TO regress_test_role;
  136. GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION;
  137. \des+
  138. SET ROLE regress_test_role;
  139. ALTER SERVER s1 VERSION '1.1'; -- ERROR
  140. ALTER SERVER s1 OWNER TO regress_test_role; -- ERROR
  141. RESET ROLE;
  142. ALTER SERVER s1 OWNER TO regress_test_role;
  143. GRANT regress_test_role2 TO regress_test_role;
  144. SET ROLE regress_test_role;
  145. ALTER SERVER s1 VERSION '1.1';
  146. ALTER SERVER s1 OWNER TO regress_test_role2; -- ERROR
  147. RESET ROLE;
  148. ALTER SERVER s8 OPTIONS (foo '1'); -- ERROR option validation
  149. ALTER SERVER s8 OPTIONS (connect_timeout '30', SET dbname 'db1', DROP host);
  150. SET ROLE regress_test_role;
  151. ALTER SERVER s1 OWNER TO regress_test_indirect; -- ERROR
  152. RESET ROLE;
  153. GRANT regress_test_indirect TO regress_test_role;
  154. SET ROLE regress_test_role;
  155. ALTER SERVER s1 OWNER TO regress_test_indirect;
  156. RESET ROLE;
  157. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_indirect;
  158. SET ROLE regress_test_role;
  159. ALTER SERVER s1 OWNER TO regress_test_indirect;
  160. RESET ROLE;
  161. DROP ROLE regress_test_indirect; -- ERROR
  162. \des+
  163. ALTER SERVER s8 RENAME to s8new;
  164. \des+
  165. ALTER SERVER s8new RENAME to s8;
  166. -- DROP SERVER
  167. DROP SERVER nonexistent; -- ERROR
  168. DROP SERVER IF EXISTS nonexistent;
  169. \des
  170. SET ROLE regress_test_role;
  171. DROP SERVER s2; -- ERROR
  172. DROP SERVER s1;
  173. RESET ROLE;
  174. \des
  175. ALTER SERVER s2 OWNER TO regress_test_role;
  176. SET ROLE regress_test_role;
  177. DROP SERVER s2;
  178. RESET ROLE;
  179. \des
  180. CREATE USER MAPPING FOR current_user SERVER s3;
  181. \deu
  182. DROP SERVER s3; -- ERROR
  183. DROP SERVER s3 CASCADE;
  184. \des
  185. \deu
  186. -- CREATE USER MAPPING
  187. CREATE USER MAPPING FOR regress_test_missing_role SERVER s1; -- ERROR
  188. CREATE USER MAPPING FOR current_user SERVER s1; -- ERROR
  189. CREATE USER MAPPING FOR current_user SERVER s4;
  190. CREATE USER MAPPING FOR user SERVER s4; -- ERROR duplicate
  191. CREATE USER MAPPING FOR public SERVER s4 OPTIONS ("this mapping" 'is public');
  192. CREATE USER MAPPING FOR user SERVER s8 OPTIONS (username 'test', password 'secret'); -- ERROR
  193. CREATE USER MAPPING FOR user SERVER s8 OPTIONS (user 'test', password 'secret');
  194. ALTER SERVER s5 OWNER TO regress_test_role;
  195. ALTER SERVER s6 OWNER TO regress_test_indirect;
  196. SET ROLE regress_test_role;
  197. CREATE USER MAPPING FOR current_user SERVER s5;
  198. CREATE USER MAPPING FOR current_user SERVER s6 OPTIONS (username 'test');
  199. CREATE USER MAPPING FOR current_user SERVER s7; -- ERROR
  200. CREATE USER MAPPING FOR public SERVER s8; -- ERROR
  201. RESET ROLE;
  202. ALTER SERVER t1 OWNER TO regress_test_indirect;
  203. SET ROLE regress_test_role;
  204. CREATE USER MAPPING FOR current_user SERVER t1 OPTIONS (username 'bob', password 'boo');
  205. CREATE USER MAPPING FOR public SERVER t1;
  206. RESET ROLE;
  207. \deu
  208. -- ALTER USER MAPPING
  209. ALTER USER MAPPING FOR regress_test_missing_role SERVER s4 OPTIONS (gotcha 'true'); -- ERROR
  210. ALTER USER MAPPING FOR user SERVER ss4 OPTIONS (gotcha 'true'); -- ERROR
  211. ALTER USER MAPPING FOR public SERVER s5 OPTIONS (gotcha 'true'); -- ERROR
  212. ALTER USER MAPPING FOR current_user SERVER s8 OPTIONS (username 'test'); -- ERROR
  213. ALTER USER MAPPING FOR current_user SERVER s8 OPTIONS (DROP user, SET password 'public');
  214. SET ROLE regress_test_role;
  215. ALTER USER MAPPING FOR current_user SERVER s5 OPTIONS (ADD modified '1');
  216. ALTER USER MAPPING FOR public SERVER s4 OPTIONS (ADD modified '1'); -- ERROR
  217. ALTER USER MAPPING FOR public SERVER t1 OPTIONS (ADD modified '1');
  218. RESET ROLE;
  219. \deu+
  220. -- DROP USER MAPPING
  221. DROP USER MAPPING FOR regress_test_missing_role SERVER s4; -- ERROR
  222. DROP USER MAPPING FOR user SERVER ss4;
  223. DROP USER MAPPING FOR public SERVER s7; -- ERROR
  224. DROP USER MAPPING IF EXISTS FOR regress_test_missing_role SERVER s4;
  225. DROP USER MAPPING IF EXISTS FOR user SERVER ss4;
  226. DROP USER MAPPING IF EXISTS FOR public SERVER s7;
  227. CREATE USER MAPPING FOR public SERVER s8;
  228. SET ROLE regress_test_role;
  229. DROP USER MAPPING FOR public SERVER s8; -- ERROR
  230. RESET ROLE;
  231. DROP SERVER s7;
  232. \deu
  233. -- CREATE FOREIGN TABLE
  234. CREATE SCHEMA foreign_schema;
  235. CREATE SERVER s0 FOREIGN DATA WRAPPER dummy;
  236. CREATE FOREIGN TABLE ft1 (); -- ERROR
  237. CREATE FOREIGN TABLE ft1 () SERVER no_server; -- ERROR
  238. CREATE FOREIGN TABLE ft1 () SERVER s0 WITH OIDS; -- ERROR
  239. CREATE FOREIGN TABLE ft1 (
  240. c1 integer OPTIONS ("param 1" 'val1') NOT NULL,
  241. c2 text OPTIONS (param2 'val2', param3 'val3'),
  242. c3 date
  243. ) SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted" 'value');
  244. COMMENT ON FOREIGN TABLE ft1 IS 'ft1';
  245. COMMENT ON COLUMN ft1.c1 IS 'ft1.c1';
  246. \d+ ft1
  247. \det+
  248. CREATE INDEX id_ft1_c2 ON ft1 (c2); -- ERROR
  249. SELECT * FROM ft1; -- ERROR
  250. EXPLAIN SELECT * FROM ft1; -- ERROR
  251. -- ALTER FOREIGN TABLE
  252. COMMENT ON FOREIGN TABLE ft1 IS 'foreign table';
  253. COMMENT ON FOREIGN TABLE ft1 IS NULL;
  254. COMMENT ON COLUMN ft1.c1 IS 'foreign column';
  255. COMMENT ON COLUMN ft1.c1 IS NULL;
  256. ALTER FOREIGN TABLE ft1 ADD COLUMN c4 integer;
  257. ALTER FOREIGN TABLE ft1 ADD COLUMN c5 integer DEFAULT 0;
  258. ALTER FOREIGN TABLE ft1 ADD COLUMN c6 integer;
  259. ALTER FOREIGN TABLE ft1 ADD COLUMN c7 integer NOT NULL;
  260. ALTER FOREIGN TABLE ft1 ADD COLUMN c8 integer;
  261. ALTER FOREIGN TABLE ft1 ADD COLUMN c9 integer;
  262. ALTER FOREIGN TABLE ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1');
  263. ALTER FOREIGN TABLE ft1 ALTER COLUMN c4 SET DEFAULT 0;
  264. ALTER FOREIGN TABLE ft1 ALTER COLUMN c5 DROP DEFAULT;
  265. ALTER FOREIGN TABLE ft1 ALTER COLUMN c6 SET NOT NULL;
  266. ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 DROP NOT NULL;
  267. ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10) USING '0'; -- ERROR
  268. ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE char(10);
  269. ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET DATA TYPE text;
  270. ALTER FOREIGN TABLE ft1 ALTER COLUMN xmin OPTIONS (ADD p1 'v1'); -- ERROR
  271. ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'),
  272. ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2');
  273. ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1);
  274. ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET STATISTICS 10000;
  275. ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 SET (n_distinct = 100);
  276. ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STATISTICS -1;
  277. \d+ ft1
  278. -- can't change the column type if it's used elsewhere
  279. CREATE TABLE use_ft1_column_type (x ft1);
  280. ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET DATA TYPE integer; -- ERROR
  281. DROP TABLE use_ft1_column_type;
  282. ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c9_check CHECK (c9 < 0); -- ERROR
  283. ALTER FOREIGN TABLE ft1 DROP CONSTRAINT no_const; -- ERROR
  284. ALTER FOREIGN TABLE ft1 DROP CONSTRAINT IF EXISTS no_const;
  285. ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c1_check;
  286. ALTER FOREIGN TABLE ft1 SET WITH OIDS; -- ERROR
  287. ALTER FOREIGN TABLE ft1 OWNER TO regress_test_role;
  288. ALTER FOREIGN TABLE ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@');
  289. ALTER FOREIGN TABLE ft1 DROP COLUMN no_column; -- ERROR
  290. ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column;
  291. ALTER FOREIGN TABLE ft1 DROP COLUMN c9;
  292. ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema;
  293. ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR
  294. ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1;
  295. ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1;
  296. \d foreign_schema.foreign_table_1
  297. -- alter noexisting table
  298. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c4 integer;
  299. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c6 integer;
  300. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c7 integer NOT NULL;
  301. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c8 integer;
  302. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c9 integer;
  303. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ADD COLUMN c10 integer OPTIONS (p1 'v1');
  304. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c6 SET NOT NULL;
  305. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 DROP NOT NULL;
  306. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 TYPE char(10);
  307. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 SET DATA TYPE text;
  308. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'),
  309. ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2');
  310. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1);
  311. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT IF EXISTS no_const;
  312. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP CONSTRAINT ft1_c1_check;
  313. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OWNER TO regress_test_role;
  314. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@');
  315. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN IF EXISTS no_column;
  316. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 DROP COLUMN c9;
  317. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 SET SCHEMA foreign_schema;
  318. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME c1 TO foreign_column_1;
  319. ALTER FOREIGN TABLE IF EXISTS doesnt_exist_ft1 RENAME TO foreign_table_1;
  320. -- Information schema
  321. SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2;
  322. SELECT * FROM information_schema.foreign_data_wrapper_options ORDER BY 1, 2, 3;
  323. SELECT * FROM information_schema.foreign_servers ORDER BY 1, 2;
  324. SELECT * FROM information_schema.foreign_server_options ORDER BY 1, 2, 3;
  325. SELECT * FROM information_schema.user_mappings ORDER BY lower(authorization_identifier), 2, 3;
  326. SELECT * FROM information_schema.user_mapping_options ORDER BY lower(authorization_identifier), 2, 3, 4;
  327. SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
  328. SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
  329. SELECT * FROM information_schema.foreign_tables ORDER BY 1, 2, 3;
  330. SELECT * FROM information_schema.foreign_table_options ORDER BY 1, 2, 3, 4;
  331. SET ROLE regress_test_role;
  332. SELECT * FROM information_schema.user_mapping_options ORDER BY 1, 2, 3, 4;
  333. SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
  334. SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE 'FOREIGN%' AND object_name IN ('s6', 'foo') ORDER BY 1, 2, 3, 4, 5;
  335. DROP USER MAPPING FOR current_user SERVER t1;
  336. SET ROLE regress_test_role2;
  337. SELECT * FROM information_schema.user_mapping_options ORDER BY 1, 2, 3, 4;
  338. RESET ROLE;
  339. -- has_foreign_data_wrapper_privilege
  340. SELECT has_foreign_data_wrapper_privilege('regress_test_role',
  341. (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE');
  342. SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE');
  343. SELECT has_foreign_data_wrapper_privilege(
  344. (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'),
  345. (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE');
  346. SELECT has_foreign_data_wrapper_privilege(
  347. (SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE');
  348. SELECT has_foreign_data_wrapper_privilege(
  349. (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 'foo', 'USAGE');
  350. SELECT has_foreign_data_wrapper_privilege('foo', 'USAGE');
  351. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role;
  352. SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE');
  353. -- has_server_privilege
  354. SELECT has_server_privilege('regress_test_role',
  355. (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE');
  356. SELECT has_server_privilege('regress_test_role', 's8', 'USAGE');
  357. SELECT has_server_privilege(
  358. (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'),
  359. (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE');
  360. SELECT has_server_privilege(
  361. (SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE');
  362. SELECT has_server_privilege(
  363. (SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 's8', 'USAGE');
  364. SELECT has_server_privilege('s8', 'USAGE');
  365. GRANT USAGE ON FOREIGN SERVER s8 TO regress_test_role;
  366. SELECT has_server_privilege('regress_test_role', 's8', 'USAGE');
  367. REVOKE USAGE ON FOREIGN SERVER s8 FROM regress_test_role;
  368. GRANT USAGE ON FOREIGN SERVER s4 TO regress_test_role;
  369. DROP USER MAPPING FOR public SERVER s4;
  370. ALTER SERVER s6 OPTIONS (DROP host, DROP dbname);
  371. ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (DROP username);
  372. ALTER FOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator;
  373. -- Privileges
  374. SET ROLE unprivileged_role;
  375. CREATE FOREIGN DATA WRAPPER foobar; -- ERROR
  376. ALTER FOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR
  377. ALTER FOREIGN DATA WRAPPER foo OWNER TO unprivileged_role; -- ERROR
  378. DROP FOREIGN DATA WRAPPER foo; -- ERROR
  379. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR
  380. CREATE SERVER s9 FOREIGN DATA WRAPPER foo; -- ERROR
  381. ALTER SERVER s4 VERSION '0.5'; -- ERROR
  382. ALTER SERVER s4 OWNER TO unprivileged_role; -- ERROR
  383. DROP SERVER s4; -- ERROR
  384. GRANT USAGE ON FOREIGN SERVER s4 TO regress_test_role; -- ERROR
  385. CREATE USER MAPPING FOR public SERVER s4; -- ERROR
  386. ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR
  387. DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR
  388. RESET ROLE;
  389. GRANT USAGE ON FOREIGN DATA WRAPPER postgresql TO unprivileged_role;
  390. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO unprivileged_role WITH GRANT OPTION;
  391. SET ROLE unprivileged_role;
  392. CREATE FOREIGN DATA WRAPPER foobar; -- ERROR
  393. ALTER FOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR
  394. DROP FOREIGN DATA WRAPPER foo; -- ERROR
  395. GRANT USAGE ON FOREIGN DATA WRAPPER postgresql TO regress_test_role; -- WARNING
  396. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role;
  397. CREATE SERVER s9 FOREIGN DATA WRAPPER postgresql;
  398. ALTER SERVER s6 VERSION '0.5'; -- ERROR
  399. DROP SERVER s6; -- ERROR
  400. GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role; -- ERROR
  401. GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role;
  402. CREATE USER MAPPING FOR public SERVER s6; -- ERROR
  403. CREATE USER MAPPING FOR public SERVER s9;
  404. ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR
  405. DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR
  406. RESET ROLE;
  407. REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM unprivileged_role; -- ERROR
  408. REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM unprivileged_role CASCADE;
  409. SET ROLE unprivileged_role;
  410. GRANT USAGE ON FOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR
  411. CREATE SERVER s10 FOREIGN DATA WRAPPER foo; -- ERROR
  412. ALTER SERVER s9 VERSION '1.1';
  413. GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role;
  414. CREATE USER MAPPING FOR current_user SERVER s9;
  415. DROP SERVER s9 CASCADE;
  416. RESET ROLE;
  417. CREATE SERVER s9 FOREIGN DATA WRAPPER foo;
  418. GRANT USAGE ON FOREIGN SERVER s9 TO unprivileged_role;
  419. SET ROLE unprivileged_role;
  420. ALTER SERVER s9 VERSION '1.2'; -- ERROR
  421. GRANT USAGE ON FOREIGN SERVER s9 TO regress_test_role; -- WARNING
  422. CREATE USER MAPPING FOR current_user SERVER s9;
  423. DROP SERVER s9 CASCADE; -- ERROR
  424. RESET ROLE;
  425. -- Triggers
  426. CREATE FUNCTION dummy_trigger() RETURNS TRIGGER AS $$
  427. BEGIN
  428. RETURN NULL;
  429. END
  430. $$ language plpgsql;
  431. CREATE TRIGGER trigtest_before_stmt BEFORE INSERT OR UPDATE OR DELETE
  432. ON foreign_schema.foreign_table_1
  433. FOR EACH STATEMENT
  434. EXECUTE PROCEDURE dummy_trigger();
  435. CREATE TRIGGER trigtest_after_stmt AFTER INSERT OR UPDATE OR DELETE
  436. ON foreign_schema.foreign_table_1
  437. FOR EACH STATEMENT
  438. EXECUTE PROCEDURE dummy_trigger();
  439. CREATE TRIGGER trigtest_before_row BEFORE INSERT OR UPDATE OR DELETE
  440. ON foreign_schema.foreign_table_1
  441. FOR EACH ROW
  442. EXECUTE PROCEDURE dummy_trigger();
  443. CREATE TRIGGER trigtest_after_row AFTER INSERT OR UPDATE OR DELETE
  444. ON foreign_schema.foreign_table_1
  445. FOR EACH ROW
  446. EXECUTE PROCEDURE dummy_trigger();
  447. CREATE CONSTRAINT TRIGGER trigtest_constraint AFTER INSERT OR UPDATE OR DELETE
  448. ON foreign_schema.foreign_table_1
  449. FOR EACH ROW
  450. EXECUTE PROCEDURE dummy_trigger();
  451. ALTER FOREIGN TABLE foreign_schema.foreign_table_1
  452. DISABLE TRIGGER trigtest_before_stmt;
  453. ALTER FOREIGN TABLE foreign_schema.foreign_table_1
  454. ENABLE TRIGGER trigtest_before_stmt;
  455. DROP TRIGGER trigtest_before_stmt ON foreign_schema.foreign_table_1;
  456. DROP TRIGGER trigtest_before_row ON foreign_schema.foreign_table_1;
  457. DROP TRIGGER trigtest_after_stmt ON foreign_schema.foreign_table_1;
  458. DROP TRIGGER trigtest_after_row ON foreign_schema.foreign_table_1;
  459. DROP FUNCTION dummy_trigger();
  460. -- DROP FOREIGN TABLE
  461. DROP FOREIGN TABLE no_table; -- ERROR
  462. DROP FOREIGN TABLE IF EXISTS no_table;
  463. DROP FOREIGN TABLE foreign_schema.foreign_table_1;
  464. -- Cleanup
  465. DROP SCHEMA foreign_schema CASCADE;
  466. DROP ROLE regress_test_role; -- ERROR
  467. DROP SERVER s5 CASCADE;
  468. DROP SERVER t1 CASCADE;
  469. DROP SERVER t2;
  470. DROP USER MAPPING FOR regress_test_role SERVER s6;
  471. -- This test causes some order dependent cascade detail output,
  472. -- so switch to terse mode for it.
  473. \set VERBOSITY terse
  474. DROP FOREIGN DATA WRAPPER foo CASCADE;
  475. \set VERBOSITY default
  476. DROP SERVER s8 CASCADE;
  477. DROP ROLE regress_test_indirect;
  478. DROP ROLE regress_test_role;
  479. DROP ROLE unprivileged_role; -- ERROR
  480. REVOKE ALL ON FOREIGN DATA WRAPPER postgresql FROM unprivileged_role;
  481. DROP ROLE unprivileged_role;
  482. DROP ROLE regress_test_role2;
  483. DROP FOREIGN DATA WRAPPER postgresql CASCADE;
  484. DROP FOREIGN DATA WRAPPER dummy CASCADE;
  485. \c
  486. DROP ROLE foreign_data_user;
  487. -- At this point we should have no wrappers, no servers, and no mappings.
  488. SELECT fdwname, fdwhandler, fdwvalidator, fdwoptions FROM pg_foreign_data_wrapper;
  489. SELECT srvname, srvoptions FROM pg_foreign_server;
  490. SELECT * FROM pg_user_mapping;