-- -- Test foreign-data wrapper and server management. --
-- directory paths and dlsuffix are passed to us in environment variables
\getenv libdir PG_LIBDIR
\getenv dlsuffix PG_DLSUFFIX
\set regresslib :libdir '/regress' :dlsuffix
CREATE FUNCTION test_fdw_handler()
RETURNS fdw_handler AS :'regresslib', 'test_fdw_handler'
LANGUAGE C;
-- Clean up in case a prior regression run failed
-- Suppress NOTICE messages when roles don't exist SET client_min_messages TO'warning';
DROP ROLE IFEXISTS regress_foreign_data_user, regress_test_role, regress_test_role2, regress_test_role_super, regress_test_indirect, regress_unprivileged_role;
RESET client_min_messages;
CREATE ROLE regress_foreign_data_user LOGIN SUPERUSER; SET SESSION AUTHORIZATION 'regress_foreign_data_user';
CREATE ROLE regress_test_role; CREATE ROLE regress_test_role2; CREATE ROLE regress_test_role_super SUPERUSER; CREATE ROLE regress_test_indirect; CREATE ROLE regress_unprivileged_role;
CREATEFOREIGN DATA WRAPPER dummy;
COMMENT ONFOREIGN DATA WRAPPER dummy IS'useless'; CREATEFOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;
-- At this point we should have 2 built-in wrappers and no servers. SELECT fdwname, fdwhandler::regproc, fdwvalidator::regproc, fdwoptions FROM pg_foreign_data_wrapper ORDERBY1, 2, 3; SELECT srvname, srvoptions FROM pg_foreign_server; SELECT * FROM pg_user_mapping;
-- CREATE FOREIGN DATA WRAPPER CREATEFOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR CREATEFOREIGN DATA WRAPPER foo;
\dew
CREATEFOREIGN DATA WRAPPER foo; -- duplicate DROPFOREIGN DATA WRAPPER foo; CREATEFOREIGN DATA WRAPPER foo OPTIONS (testing '1');
\dew+
DROPFOREIGN DATA WRAPPER foo; CREATEFOREIGN DATA WRAPPER foo OPTIONS (testing '1', testing '2'); -- ERROR CREATEFOREIGN DATA WRAPPER foo OPTIONS (testing '1', another '2');
\dew+
DROPFOREIGN DATA WRAPPER foo; SET ROLE regress_test_role; CREATEFOREIGN DATA WRAPPER foo; -- ERROR
RESET ROLE; CREATEFOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator;
\dew+
-- HANDLER related checks CREATE FUNCTION invalid_fdw_handler() RETURNS int LANGUAGE SQLAS'SELECT 1;'; CREATEFOREIGN DATA WRAPPER test_fdw HANDLER invalid_fdw_handler; -- ERROR CREATEFOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER invalid_fdw_handler; -- ERROR CREATEFOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler;
-- should preserve dependency on test_fdw_handler ALTERFOREIGN DATA WRAPPER test_fdw VALIDATOR postgresql_fdw_validator; DROP FUNCTION test_fdw_handler(); -- ERROR
DROPFOREIGN DATA WRAPPER test_fdw;
-- ALTER FOREIGN DATA WRAPPER ALTERFOREIGN DATA WRAPPER foo OPTIONS (nonexistent 'fdw'); -- ERROR
ALTERFOREIGN DATA WRAPPER foo; -- ERROR ALTERFOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR ALTERFOREIGN DATA WRAPPER foo NO VALIDATOR;
\dew+
ALTERFOREIGN DATA WRAPPER foo OPTIONS (a '1', b '2'); ALTERFOREIGN DATA WRAPPER foo OPTIONS (SET c '4'); -- ERROR ALTERFOREIGN DATA WRAPPER foo OPTIONS (DROP c); -- ERROR ALTERFOREIGN DATA WRAPPER foo OPTIONS (ADD x '1', DROP x);
\dew+
ALTERFOREIGN DATA WRAPPER foo OPTIONS (DROP a, SET b '3', ADD c '4');
\dew+
ALTERFOREIGN DATA WRAPPER foo OPTIONS (a '2'); ALTERFOREIGN DATA WRAPPER foo OPTIONS (b '4'); -- ERROR
\dew+
SET ROLE regress_test_role; ALTERFOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); -- ERROR SET ROLE regress_test_role_super; ALTERFOREIGN DATA WRAPPER foo OPTIONS (ADD d '5');
\dew+
ALTERFOREIGN DATA WRAPPER foo OWNER TO regress_test_role; -- ERROR ALTERFOREIGN DATA WRAPPER foo OWNER TO regress_test_role_super; ALTER ROLE regress_test_role_super NOSUPERUSER; SET ROLE regress_test_role_super; ALTERFOREIGN DATA WRAPPER foo OPTIONS (ADD e '6'); -- ERROR
RESET ROLE;
\dew+
ALTERFOREIGN DATA WRAPPER foo RENAMETO foo1;
\dew+ ALTERFOREIGN DATA WRAPPER foo1 RENAMETO foo;
-- HANDLER related checks ALTERFOREIGN DATA WRAPPER foo HANDLER invalid_fdw_handler; -- ERROR ALTERFOREIGN DATA WRAPPER foo HANDLER test_fdw_handler HANDLER anything; -- ERROR ALTERFOREIGN DATA WRAPPER foo HANDLER test_fdw_handler; DROP FUNCTION invalid_fdw_handler();
-- DROP FOREIGN DATA WRAPPER DROPFOREIGN DATA WRAPPER nonexistent; -- ERROR DROPFOREIGN DATA WRAPPER IFEXISTS nonexistent;
\dew+
DROP ROLE regress_test_role_super; -- ERROR SET ROLE regress_test_role_super; DROPFOREIGN DATA WRAPPER foo;
RESET ROLE; DROP ROLE regress_test_role_super;
\dew+
CREATEFOREIGN DATA WRAPPER foo; CREATE SERVER s1 FOREIGN DATA WRAPPER foo;
COMMENT ON SERVER s1 IS'foreign server'; CREATE USER MAPPING FORcurrent_user SERVER s1; CREATE USER MAPPING FORcurrent_user SERVER s1; -- ERROR CREATE USER MAPPING IFNOTEXISTSFORcurrent_user SERVER s1; -- NOTICE
\dew+
\des+
\deu+ DROPFOREIGN DATA WRAPPER foo; -- ERROR SET ROLE regress_test_role; DROPFOREIGN DATA WRAPPER foo CASCADE; -- ERROR
RESET ROLE; DROPFOREIGN DATA WRAPPER foo CASCADE;
\dew+
\des+
\deu+
-- exercise CREATE SERVER CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR CREATEFOREIGN DATA WRAPPER foo OPTIONS ("test wrapper"'true'); CREATE SERVER s1 FOREIGN DATA WRAPPER foo; CREATE SERVER s1 FOREIGN DATA WRAPPER foo; -- ERROR CREATE SERVER IFNOTEXISTS s1 FOREIGN DATA WRAPPER foo; -- No ERROR, just NOTICE CREATE SERVER s2 FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); CREATE SERVER s3 TYPE 'oracle'FOREIGN DATA WRAPPER foo; CREATE SERVER s4 TYPE 'oracle'FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); CREATE SERVER s5 VERSION '15.0'FOREIGN DATA WRAPPER foo; CREATE SERVER s6 VERSION '16.0'FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); CREATE SERVER s7 TYPE 'oracle' VERSION '17.0'FOREIGN DATA WRAPPER foo OPTIONS (host 'a', dbname 'b'); CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (foo '1'); -- ERROR CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (host 'localhost', dbname 's8db');
\des+ SET ROLE regress_test_role; CREATE SERVER t1 FOREIGN DATA WRAPPER foo; -- ERROR: no usage on FDW
RESET ROLE; GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_test_role; SET ROLE regress_test_role; CREATE SERVER t1 FOREIGN DATA WRAPPER foo;
RESET ROLE;
\des+
REVOKEUSAGEONFOREIGN DATA WRAPPER foo FROM regress_test_role; GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_test_indirect; SET ROLE regress_test_role; CREATE SERVER t2 FOREIGN DATA WRAPPER foo; -- ERROR
RESET ROLE; GRANT regress_test_indirect TO regress_test_role; SET ROLE regress_test_role; CREATE SERVER t2 FOREIGN DATA WRAPPER foo;
\des+
RESET ROLE; REVOKE regress_test_indirect FROM regress_test_role;
-- ALTER SERVER ALTER SERVER s0; -- ERROR ALTER SERVER s0 OPTIONS (a '1'); -- ERROR ALTER SERVER s1 VERSION '1.0' OPTIONS (servername 's1'); ALTER SERVER s2 VERSION '1.1'; ALTER SERVER s3 OPTIONS ("tns name"'orcl', port '1521'); GRANTUSAGEONFOREIGN SERVER s1 TO regress_test_role; GRANTUSAGEONFOREIGN SERVER s6 TO regress_test_role2 WITHGRANTOPTION;
\des+ SET ROLE regress_test_role; ALTER SERVER s1 VERSION '1.1'; -- ERROR ALTER SERVER s1 OWNER TO regress_test_role; -- ERROR
RESET ROLE; ALTER SERVER s1 OWNER TO regress_test_role; GRANT regress_test_role2 TO regress_test_role; SET ROLE regress_test_role; ALTER SERVER s1 VERSION '1.1'; ALTER SERVER s1 OWNER TO regress_test_role2; -- ERROR
RESET ROLE; ALTER SERVER s8 OPTIONS (foo '1'); -- ERROR option validation ALTER SERVER s8 OPTIONS (connect_timeout '30', SET dbname 'db1', DROP host); SET ROLE regress_test_role; ALTER SERVER s1 OWNER TO regress_test_indirect; -- ERROR
RESET ROLE; GRANT regress_test_indirect TO regress_test_role; SET ROLE regress_test_role; ALTER SERVER s1 OWNER TO regress_test_indirect;
RESET ROLE; GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_test_indirect; SET ROLE regress_test_role; ALTER SERVER s1 OWNER TO regress_test_indirect;
RESET ROLE; DROP ROLE regress_test_indirect; -- ERROR
\des+
ALTER SERVER s8 RENAMEto s8new;
\des+ ALTER SERVER s8new RENAMEto s8;
-- DROP SERVER DROP SERVER nonexistent; -- ERROR DROP SERVER IFEXISTS nonexistent;
\des SET ROLE regress_test_role; DROP SERVER s2; -- ERROR DROP SERVER s1;
RESET ROLE;
\des ALTER SERVER s2 OWNER TO regress_test_role; SET ROLE regress_test_role; DROP SERVER s2;
RESET ROLE;
\des CREATE USER MAPPING FORcurrent_user SERVER s3;
\deu DROP SERVER s3; -- ERROR DROP SERVER s3 CASCADE;
\des
\deu
-- CREATE USER MAPPING CREATE USER MAPPING FOR regress_test_missing_role SERVER s1; -- ERROR CREATE USER MAPPING FORcurrent_user SERVER s1; -- ERROR CREATE USER MAPPING FORcurrent_user SERVER s4; CREATE USER MAPPING FOR user SERVER s4; -- ERROR duplicate CREATE USER MAPPING FOR public SERVER s4 OPTIONS ("this mapping"'is public'); CREATE USER MAPPING FOR user SERVER s8 OPTIONS (username 'test', password 'secret'); -- ERROR CREATE USER MAPPING FOR user SERVER s8 OPTIONS (user 'test', password 'secret'); ALTER SERVER s5 OWNER TO regress_test_role; ALTER SERVER s6 OWNER TO regress_test_indirect; SET ROLE regress_test_role; CREATE USER MAPPING FORcurrent_user SERVER s5; CREATE USER MAPPING FORcurrent_user SERVER s6 OPTIONS (username 'test'); CREATE USER MAPPING FORcurrent_user SERVER s7; -- ERROR CREATE USER MAPPING FOR public SERVER s8; -- ERROR
RESET ROLE;
ALTER SERVER t1 OWNER TO regress_test_indirect; SET ROLE regress_test_role; CREATE USER MAPPING FORcurrent_user SERVER t1 OPTIONS (username 'bob', password 'boo'); CREATE USER MAPPING FOR public SERVER t1;
RESET ROLE;
\deu
-- ALTER USER MAPPING ALTER USER MAPPING FOR regress_test_missing_role SERVER s4 OPTIONS (gotcha 'true'); -- ERROR ALTER USER MAPPING FOR user SERVER ss4 OPTIONS (gotcha 'true'); -- ERROR ALTER USER MAPPING FOR public SERVER s5 OPTIONS (gotcha 'true'); -- ERROR ALTER USER MAPPING FORcurrent_user SERVER s8 OPTIONS (username 'test'); -- ERROR ALTER USER MAPPING FORcurrent_user SERVER s8 OPTIONS (DROP user, SET password 'public'); SET ROLE regress_test_role; ALTER USER MAPPING FORcurrent_user SERVER s5 OPTIONS (ADD modified '1'); ALTER USER MAPPING FOR public SERVER s4 OPTIONS (ADD modified '1'); -- ERROR ALTER USER MAPPING FOR public SERVER t1 OPTIONS (ADD modified '1');
RESET ROLE;
\deu+
-- DROP USER MAPPING DROP USER MAPPING FOR regress_test_missing_role SERVER s4; -- ERROR DROP USER MAPPING FOR user SERVER ss4; DROP USER MAPPING FOR public SERVER s7; -- ERROR DROP USER MAPPING IFEXISTSFOR regress_test_missing_role SERVER s4; DROP USER MAPPING IFEXISTSFOR user SERVER ss4; DROP USER MAPPING IFEXISTSFOR public SERVER s7; CREATE USER MAPPING FOR public SERVER s8; SET ROLE regress_test_role; DROP USER MAPPING FOR public SERVER s8; -- ERROR
RESET ROLE; DROP SERVER s7;
\deu
SELECT * FROM information_schema.foreign_data_wrappers ORDERBY1, 2; SELECT * FROM information_schema.foreign_data_wrapper_options ORDERBY1, 2, 3; SELECT * FROM information_schema.foreign_servers ORDERBY1, 2; SELECT * FROM information_schema.foreign_server_options ORDERBY1, 2, 3; SELECT * FROM information_schema.user_mappings ORDERBY lower(authorization_identifier), 2, 3; SELECT * FROM information_schema.user_mapping_options ORDERBY lower(authorization_identifier), 2, 3, 4; SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE'FOREIGN%'AND object_name IN ('s6', 'foo') ORDERBY1, 2, 3, 4, 5; SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE'FOREIGN%'ANDobject_name IN ('s6', 'foo') ORDERBY1, 2, 3, 4, 5; SELECT * FROM information_schema.foreign_tables ORDERBY1, 2, 3; SELECT * FROM information_schema.foreign_table_options ORDERBY1, 2, 3, 4; SET ROLE regress_test_role; SELECT * FROM information_schema.user_mapping_options ORDERBY1, 2, 3, 4; SELECT * FROM information_schema.usage_privileges WHERE object_type LIKE'FOREIGN%'AND object_name IN ('s6', 'foo') ORDERBY1, 2, 3, 4, 5; SELECT * FROM information_schema.role_usage_grants WHERE object_type LIKE'FOREIGN%'ANDobject_name IN ('s6', 'foo') ORDERBY1, 2, 3, 4, 5; DROP USER MAPPING FORcurrent_user SERVER t1; SET ROLE regress_test_role2; SELECT * FROM information_schema.user_mapping_options ORDERBY1, 2, 3, 4;
RESET ROLE;
-- has_foreign_data_wrapper_privilege SELECT has_foreign_data_wrapper_privilege('regress_test_role',
(SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE'); SELECT has_foreign_data_wrapper_privilege(
(SELECT oid FROM pg_roles WHERE rolname='regress_test_role'),
(SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); SELECT has_foreign_data_wrapper_privilege(
(SELECT oid FROM pg_foreign_data_wrapper WHERE fdwname='foo'), 'USAGE'); SELECT has_foreign_data_wrapper_privilege(
(SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 'foo', 'USAGE'); SELECT has_foreign_data_wrapper_privilege('foo', 'USAGE'); GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_test_role; SELECT has_foreign_data_wrapper_privilege('regress_test_role', 'foo', 'USAGE');
-- has_server_privilege SELECT has_server_privilege('regress_test_role',
(SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); SELECT has_server_privilege('regress_test_role', 's8', 'USAGE'); SELECT has_server_privilege(
(SELECT oid FROM pg_roles WHERE rolname='regress_test_role'),
(SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); SELECT has_server_privilege(
(SELECT oid FROM pg_foreign_server WHERE srvname='s8'), 'USAGE'); SELECT has_server_privilege(
(SELECT oid FROM pg_roles WHERE rolname='regress_test_role'), 's8', 'USAGE'); SELECT has_server_privilege('s8', 'USAGE'); GRANTUSAGEONFOREIGN SERVER s8 TO regress_test_role; SELECT has_server_privilege('regress_test_role', 's8', 'USAGE'); REVOKEUSAGEONFOREIGN SERVER s8 FROM regress_test_role;
GRANTUSAGEONFOREIGN SERVER s4 TO regress_test_role; DROP USER MAPPING FOR public SERVER s4; ALTER SERVER s6 OPTIONS (DROP host, DROP dbname); ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (DROP username); ALTERFOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator;
-- Privileges SET ROLE regress_unprivileged_role; CREATEFOREIGN DATA WRAPPER foobar; -- ERROR ALTERFOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR ALTERFOREIGN DATA WRAPPER foo OWNER TO regress_unprivileged_role; -- ERROR DROPFOREIGN DATA WRAPPER foo; -- ERROR GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR CREATE SERVER s9 FOREIGN DATA WRAPPER foo; -- ERROR ALTER SERVER s4 VERSION '0.5'; -- ERROR ALTER SERVER s4 OWNER TO regress_unprivileged_role; -- ERROR DROP SERVER s4; -- ERROR GRANTUSAGEONFOREIGN SERVER s4 TO regress_test_role; -- ERROR CREATE USER MAPPING FOR public SERVER s4; -- ERROR ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR
RESET ROLE;
GRANTUSAGEONFOREIGN DATA WRAPPER postgresql TO regress_unprivileged_role; GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_unprivileged_role WITHGRANTOPTION; SET ROLE regress_unprivileged_role; CREATEFOREIGN DATA WRAPPER foobar; -- ERROR ALTERFOREIGN DATA WRAPPER foo OPTIONS (gotcha 'true'); -- ERROR DROPFOREIGN DATA WRAPPER foo; -- ERROR GRANTUSAGEONFOREIGN DATA WRAPPER postgresql TO regress_test_role; -- WARNING GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_test_role; CREATE SERVER s9 FOREIGN DATA WRAPPER postgresql; ALTER SERVER s6 VERSION '0.5'; -- ERROR DROP SERVER s6; -- ERROR GRANTUSAGEONFOREIGN SERVER s6 TO regress_test_role; -- ERROR GRANTUSAGEONFOREIGN SERVER s9 TO regress_test_role; CREATE USER MAPPING FOR public SERVER s6; -- ERROR CREATE USER MAPPING FOR public SERVER s9; ALTER USER MAPPING FOR regress_test_role SERVER s6 OPTIONS (gotcha 'true'); -- ERROR DROP USER MAPPING FOR regress_test_role SERVER s6; -- ERROR
RESET ROLE;
REVOKEUSAGEONFOREIGN DATA WRAPPER foo FROM regress_unprivileged_role; -- ERROR REVOKEUSAGEONFOREIGN DATA WRAPPER foo FROM regress_unprivileged_role CASCADE; SET ROLE regress_unprivileged_role; GRANTUSAGEONFOREIGN DATA WRAPPER foo TO regress_test_role; -- ERROR CREATE SERVER s10 FOREIGN DATA WRAPPER foo; -- ERROR ALTER SERVER s9 VERSION '1.1'; GRANTUSAGEONFOREIGN SERVER s9 TO regress_test_role; CREATE USER MAPPING FORcurrent_user SERVER s9; DROP SERVER s9 CASCADE;
RESET ROLE; CREATE SERVER s9 FOREIGN DATA WRAPPER foo; GRANTUSAGEONFOREIGN SERVER s9 TO regress_unprivileged_role; SET ROLE regress_unprivileged_role; ALTER SERVER s9 VERSION '1.2'; -- ERROR GRANTUSAGEONFOREIGN SERVER s9 TO regress_test_role; -- WARNING CREATE USER MAPPING FORcurrent_user SERVER s9; DROP SERVER s9 CASCADE; -- ERROR
-- Check visibility of user mapping data SET ROLE regress_test_role; CREATE SERVER s10 FOREIGN DATA WRAPPER foo; CREATE USER MAPPING FOR public SERVER s10 OPTIONS (user 'secret'); CREATE USER MAPPING FOR regress_unprivileged_role SERVER s10 OPTIONS (user 'secret'); -- owner of server can see some option fields
\deu+
RESET ROLE; -- superuser can see all option fields
\deu+ -- unprivileged user cannot see any option field SET ROLE regress_unprivileged_role;
\deu+
RESET ROLE; DROP SERVER s10 CASCADE;
-- Triggers CREATE FUNCTION dummy_trigger() RETURNS TRIGGERAS $$
BEGIN RETURNNULL;
END
$$ language plpgsql;
CREATETRIGGER trigtest_before_stmt BEFOREINSERTORUPDATEORDELETE ON foreign_schema.foreign_table_1 FOREACH STATEMENT
EXECUTE PROCEDURE dummy_trigger();
CREATETRIGGER trigtest_after_stmt AFTER INSERTORUPDATEORDELETE ON foreign_schema.foreign_table_1 FOREACH STATEMENT
EXECUTE PROCEDURE dummy_trigger();
CREATETRIGGER trigtest_after_stmt_tt AFTER INSERTORUPDATEORDELETE-- ERROR ON foreign_schema.foreign_table_1
REFERENCING NEW TABLEAS new_table FOREACH STATEMENT
EXECUTE PROCEDURE dummy_trigger();
CREATETRIGGER trigtest_before_row BEFOREINSERTORUPDATEORDELETE ON foreign_schema.foreign_table_1 FOREACH ROW
EXECUTE PROCEDURE dummy_trigger();
CREATETRIGGER trigtest_after_row AFTER INSERTORUPDATEORDELETE ON foreign_schema.foreign_table_1 FOREACH ROW
EXECUTE PROCEDURE dummy_trigger();
CREATECONSTRAINTTRIGGER trigtest_constraint AFTER INSERTORUPDATEORDELETE ON foreign_schema.foreign_table_1 FOREACH ROW
EXECUTE PROCEDURE dummy_trigger();
DROPTRIGGER trigtest_before_stmt ON foreign_schema.foreign_table_1; DROPTRIGGER trigtest_before_row ON foreign_schema.foreign_table_1; DROPTRIGGER trigtest_after_stmt ON foreign_schema.foreign_table_1; DROPTRIGGER trigtest_after_row ON foreign_schema.foreign_table_1;
-- NOT VALID case INSERTINTO fd_pt1 VALUES (1, 'fd_pt1'::text, '1994-01-01'::date); ALTERTABLE fd_pt1 ADDCONSTRAINT fd_pt1chk3 CHECK (c2 <> '') NOT VALID;
\d+ fd_pt1
\d+ ft2 -- VALIDATE CONSTRAINT need do nothing on foreign tables ALTERTABLE fd_pt1 VALIDATE CONSTRAINT fd_pt1chk3;
\d+ fd_pt1
\d+ ft2
-- changes name of an attribute recursively ALTERTABLE fd_pt1 RENAMECOLUMN c1 TO f1; ALTERTABLE fd_pt1 RENAMECOLUMN c2 TO f2; ALTERTABLE fd_pt1 RENAMECOLUMN c3 TO f3; -- changes name of a constraint recursively ALTERTABLE fd_pt1 RENAMECONSTRAINT fd_pt1chk3 TO f2_check;
\d+ fd_pt1
\d+ ft2
DROPTABLE fd_pt1 CASCADE;
-- IMPORT FOREIGN SCHEMA
IMPORT FOREIGNSCHEMA s1 FROM SERVER s9 INTO public; -- ERROR
IMPORT FOREIGNSCHEMA s1 LIMITTO (t1) FROM SERVER s9 INTO public; --ERROR
IMPORT FOREIGNSCHEMA s1 EXCEPT (t1) FROM SERVER s9 INTO public; -- ERROR
IMPORT FOREIGNSCHEMA s1 EXCEPT (t1, t2) FROM SERVER s9 INTO public
OPTIONS (option1 'value1', option2 'value2'); -- ERROR
-- REASSIGN OWNED/DROP OWNED of foreign objects
REASSIGN OWNED BY regress_test_role TO regress_test_role2; DROP OWNED BY regress_test_role2; DROP OWNED BY regress_test_role2 CASCADE;
-- Foreign partition DDL stuff CREATETABLE fd_pt2 (
c1 integerNOTNULL,
c2 text,
c3 date
) PARTITION BY LIST (c1); CREATEFOREIGNTABLE fd_pt2_1 PARTITION OF fd_pt2 FORVALUESIN (1)
SERVER s0 OPTIONS (delimiter ',', quote '"', "be quoted"'value');
\d+ fd_pt2
\d+ fd_pt2_1
-- cannot add column to a partition ALTERTABLE fd_pt2_1 ADD c4 char;
-- ok to have a partition's own constraints though ALTERTABLE fd_pt2_1 ALTER c3 SETNOTNULL; ALTERTABLE fd_pt2_1 ADDCONSTRAINT p21chk CHECK (c2 <> '');
\d+ fd_pt2
\d+ fd_pt2_1
-- cannot drop inherited NOT NULL constraint from a partition ALTERTABLE fd_pt2_1 ALTER c1 DROPNOTNULL;
-- foreign table cannot be part of partition tree made of temporary -- relations. CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a); CREATEFOREIGNTABLE foreign_part PARTITION OF temp_parted DEFAULT
SERVER s0; -- ERROR CREATEFOREIGNTABLE foreign_part (a int) SERVER s0; ALTERTABLE temp_parted ATTACH PARTITION foreign_part DEFAULT; -- ERROR DROPFOREIGNTABLE foreign_part; DROPTABLE temp_parted;
-- Cleanup DROPSCHEMA foreign_schema CASCADE; DROP ROLE regress_test_role; -- ERROR DROP SERVER t1 CASCADE; DROP USER MAPPING FOR regress_test_role SERVER s6; DROPFOREIGN DATA WRAPPER foo CASCADE; DROP SERVER s8 CASCADE; DROP ROLE regress_test_indirect; DROP ROLE regress_test_role; DROP ROLE regress_unprivileged_role; -- ERROR REVOKEALLONFOREIGN DATA WRAPPER postgresql FROM regress_unprivileged_role; DROP ROLE regress_unprivileged_role; DROP ROLE regress_test_role2; DROPFOREIGN DATA WRAPPER postgresql CASCADE; DROPFOREIGN DATA WRAPPER dummy CASCADE;
\c DROP ROLE regress_foreign_data_user;
-- At this point we should have no wrappers, no servers, and no mappings. SELECT fdwname, fdwhandler, fdwvalidator, fdwoptions FROM pg_foreign_data_wrapper; SELECT srvname, srvoptions FROM pg_foreign_server; SELECT * FROM pg_user_mapping;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.