diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 39c7136..baafd95 100644 *** a/src/bin/psql/describe.c --- b/src/bin/psql/describe.c *************** describeOneTableDetails(const char *sche *** 1272,1278 **** else appendPQExpBuffer(&buf, ",\n NULL AS indexdef"); if (tableinfo.relkind == 'f' && pset.sversion >= 90200) ! appendPQExpBuffer(&buf, ",\n a.attfdwoptions"); else appendPQExpBuffer(&buf, ",\n NULL AS attfdwoptions"); if (verbose) --- 1272,1279 ---- else appendPQExpBuffer(&buf, ",\n NULL AS indexdef"); if (tableinfo.relkind == 'f' && pset.sversion >= 90200) ! appendPQExpBuffer(&buf, ",\n array_to_string(ARRAY(SELECT option_name || ' ' || quote_literal(option_value) FROM " ! " pg_options_to_table(attfdwoptions)), ', ') AS attfdwoptions"); else appendPQExpBuffer(&buf, ",\n NULL AS attfdwoptions"); if (verbose) *************** describeOneTableDetails(const char *sche *** 2038,2044 **** /* Footer information about foreign table */ printfPQExpBuffer(&buf, "SELECT s.srvname,\n" ! " f.ftoptions\n" "FROM pg_catalog.pg_foreign_table f,\n" " pg_catalog.pg_foreign_server s\n" "WHERE f.ftrelid = %s AND s.oid = f.ftserver;", --- 2039,2048 ---- /* Footer information about foreign table */ printfPQExpBuffer(&buf, "SELECT s.srvname,\n" ! " array_to_string(ARRAY(SELECT " ! " option_name || ' ' || " ! " quote_literal(option_value) FROM " ! " pg_options_to_table(ftoptions)), ', ') " "FROM pg_catalog.pg_foreign_table f,\n" " pg_catalog.pg_foreign_server s\n" "WHERE f.ftrelid = %s AND s.oid = f.ftserver;", *************** listForeignDataWrappers(const char *patt *** 3679,3685 **** appendPQExpBuffer(&buf, ",\n "); printACLColumn(&buf, "fdwacl"); appendPQExpBuffer(&buf, ! ",\n fdwoptions AS \"%s\"", gettext_noop("FDW Options")); if (pset.sversion >= 90100) --- 3683,3693 ---- appendPQExpBuffer(&buf, ",\n "); printACLColumn(&buf, "fdwacl"); appendPQExpBuffer(&buf, ! ",\n array_to_string(ARRAY(SELECT " ! " option_name || ' ' || " ! " quote_literal(option_value) FROM " ! " pg_options_to_table(fdwoptions)), ', ') " ! " AS \"%s\"", gettext_noop("FDW Options")); if (pset.sversion >= 90100) *************** listForeignServers(const char *pattern, *** 3752,3758 **** ",\n" " s.srvtype AS \"%s\",\n" " s.srvversion AS \"%s\",\n" ! " s.srvoptions AS \"%s\",\n" " d.description AS \"%s\"", gettext_noop("Type"), gettext_noop("Version"), --- 3760,3770 ---- ",\n" " s.srvtype AS \"%s\",\n" " s.srvversion AS \"%s\",\n" ! " array_to_string(ARRAY(SELECT " ! " option_name || ' ' || " ! " quote_literal(option_value) FROM " ! " pg_options_to_table(srvoptions)), ', ') " ! " AS \"%s\",\n" " d.description AS \"%s\"", gettext_noop("Type"), gettext_noop("Version"), *************** listForeignTables(const char *pattern, b *** 3873,3879 **** if (verbose) appendPQExpBuffer(&buf, ! ",\n ft.ftoptions AS \"%s\",\n" " d.description AS \"%s\"", gettext_noop("FDW Options"), gettext_noop("Description")); --- 3885,3895 ---- if (verbose) appendPQExpBuffer(&buf, ! ",\n array_to_string(ARRAY(SELECT " ! " option_name || ' ' || " ! " quote_literal(option_value) FROM " ! " pg_options_to_table(ftoptions)), ', ') " ! " AS \"%s\",\n" " d.description AS \"%s\"", gettext_noop("FDW Options"), gettext_noop("Description")); diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index 4b60e8c..30ade7c 100644 *** a/src/test/regress/expected/foreign_data.out --- b/src/test/regress/expected/foreign_data.out *************** CREATE FOREIGN DATA WRAPPER foo OPTIONS *** 56,62 **** Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ------------+-------------------+---------+--------------------------+-------------------+-------------+------------- dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | {testing=1} | postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) --- 56,62 ---- Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ------------+-------------------+---------+--------------------------+-------------------+-------------+------------- dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | testing '1' | postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) *************** CREATE FOREIGN DATA WRAPPER foo OPTIONS *** 65,76 **** ERROR: option "testing" provided more than once CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', another '2'); \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+-----------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | {testing=1,another=2} | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) DROP FOREIGN DATA WRAPPER foo; --- 65,76 ---- ERROR: option "testing" provided more than once CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', another '2'); \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+--------------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | testing '1', another '2' | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) DROP FOREIGN DATA WRAPPER foo; *************** ERROR: option "c" not found *** 114,146 **** ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD x '1', DROP x); \dew+ List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+-------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | {a=1,b=2} | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP a, SET b '3', ADD c '4'); \dew+ List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+-------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | {b=3,c=4} | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '2'); ALTER FOREIGN DATA WRAPPER foo OPTIONS (b '4'); -- ERROR ERROR: option "b" provided more than once \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+---------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | {b=3,c=4,a=2} | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) SET ROLE regress_test_role; --- 114,146 ---- ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD x '1', DROP x); \dew+ List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+--------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | a '1', b '2' | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP a, SET b '3', ADD c '4'); \dew+ List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+--------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | b '3', c '4' | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '2'); ALTER FOREIGN DATA WRAPPER foo OPTIONS (b '4'); -- ERROR ERROR: option "b" provided more than once \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+---------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | b '3', c '4', a '2' | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) SET ROLE regress_test_role; *************** HINT: Must be superuser to alter a fore *** 150,161 **** SET ROLE regress_test_role_super; ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+-------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | {b=3,c=4,a=2,d=5} | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role; -- ERROR --- 150,161 ---- SET ROLE regress_test_role_super; ALTER FOREIGN DATA WRAPPER foo OPTIONS (ADD d '5'); \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------+---------+--------------------------+-------------------+----------------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | foreign_data_user | - | - | | b '3', c '4', a '2', d '5' | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role; -- ERROR *************** ERROR: permission denied to alter forei *** 169,180 **** HINT: Must be superuser to alter a foreign-data wrapper. RESET ROLE; \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------------+---------+--------------------------+-------------------+-------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | regress_test_role_super | - | - | | {b=3,c=4,a=2,d=5} | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) -- DROP FOREIGN DATA WRAPPER --- 169,180 ---- HINT: Must be superuser to alter a foreign-data wrapper. RESET ROLE; \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------------+---------+--------------------------+-------------------+----------------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | regress_test_role_super | - | - | | b '3', c '4', a '2', d '5' | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) -- DROP FOREIGN DATA WRAPPER *************** ERROR: foreign-data wrapper "nonexisten *** 183,194 **** DROP FOREIGN DATA WRAPPER IF EXISTS nonexistent; NOTICE: foreign-data wrapper "nonexistent" does not exist, skipping \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------------+---------+--------------------------+-------------------+-------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | regress_test_role_super | - | - | | {b=3,c=4,a=2,d=5} | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) DROP ROLE regress_test_role_super; -- ERROR --- 183,194 ---- DROP FOREIGN DATA WRAPPER IF EXISTS nonexistent; NOTICE: foreign-data wrapper "nonexistent" does not exist, skipping \dew+ ! List of foreign-data wrappers ! Name | Owner | Handler | Validator | Access privileges | FDW Options | Description ! ------------+-------------------------+---------+--------------------------+-------------------+----------------------------+------------- ! dummy | foreign_data_user | - | - | | | useless ! foo | regress_test_role_super | - | - | | b '3', c '4', a '2', d '5' | ! postgresql | foreign_data_user | - | postgresql_fdw_validator | | | (3 rows) DROP ROLE regress_test_role_super; -- ERROR *************** ERROR: invalid option "foo" *** 289,305 **** HINT: Valid options in this context are: authtype, service, connect_timeout, dbname, host, hostaddr, port, tty, options, requiressl, sslmode, gsslib CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (host 'localhost', dbname 's8db'); \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-------------------+--------+---------+------------------------------+------------- ! s1 | foreign_data_user | foo | | | | | ! s2 | foreign_data_user | foo | | | | {host=a,dbname=b} | ! s3 | foreign_data_user | foo | | oracle | | | ! s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b} | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | | | 16.0 | {host=a,dbname=b} | ! s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b} | ! s8 | foreign_data_user | postgresql | | | | {host=localhost,dbname=s8db} | (8 rows) SET ROLE regress_test_role; --- 289,305 ---- HINT: Valid options in this context are: authtype, service, connect_timeout, dbname, host, hostaddr, port, tty, options, requiressl, sslmode, gsslib CREATE SERVER s8 FOREIGN DATA WRAPPER postgresql OPTIONS (host 'localhost', dbname 's8db'); \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-------------------+--------+---------+---------------------------------+------------- ! s1 | foreign_data_user | foo | | | | | ! s2 | foreign_data_user | foo | | | | host 'a', dbname 'b' | ! s3 | foreign_data_user | foo | | oracle | | | ! s4 | foreign_data_user | foo | | oracle | | host 'a', dbname 'b' | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | | | 16.0 | host 'a', dbname 'b' | ! s7 | foreign_data_user | foo | | oracle | 17.0 | host 'a', dbname 'b' | ! s8 | foreign_data_user | postgresql | | | | host 'localhost', dbname 's8db' | (8 rows) SET ROLE regress_test_role; *************** SET ROLE regress_test_role; *** 311,328 **** CREATE SERVER t1 FOREIGN DATA WRAPPER foo; RESET ROLE; \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-------------------+--------+---------+------------------------------+------------- ! s1 | foreign_data_user | foo | | | | | ! s2 | foreign_data_user | foo | | | | {host=a,dbname=b} | ! s3 | foreign_data_user | foo | | oracle | | | ! s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b} | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | | | 16.0 | {host=a,dbname=b} | ! s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b} | ! s8 | foreign_data_user | postgresql | | | | {host=localhost,dbname=s8db} | ! t1 | regress_test_role | foo | | | | | (9 rows) REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_test_role; --- 311,328 ---- CREATE SERVER t1 FOREIGN DATA WRAPPER foo; RESET ROLE; \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-------------------+--------+---------+---------------------------------+------------- ! s1 | foreign_data_user | foo | | | | | ! s2 | foreign_data_user | foo | | | | host 'a', dbname 'b' | ! s3 | foreign_data_user | foo | | oracle | | | ! s4 | foreign_data_user | foo | | oracle | | host 'a', dbname 'b' | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | | | 16.0 | host 'a', dbname 'b' | ! s7 | foreign_data_user | foo | | oracle | 17.0 | host 'a', dbname 'b' | ! s8 | foreign_data_user | postgresql | | | | host 'localhost', dbname 's8db' | ! t1 | regress_test_role | foo | | | | | (9 rows) REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_test_role; *************** GRANT regress_test_indirect TO regress_t *** 335,353 **** SET ROLE regress_test_role; CREATE SERVER t2 FOREIGN DATA WRAPPER foo; \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-------------------+--------+---------+------------------------------+------------- ! s1 | foreign_data_user | foo | | | | | ! s2 | foreign_data_user | foo | | | | {host=a,dbname=b} | ! s3 | foreign_data_user | foo | | oracle | | | ! s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b} | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | | | 16.0 | {host=a,dbname=b} | ! s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b} | ! s8 | foreign_data_user | postgresql | | | | {host=localhost,dbname=s8db} | ! t1 | regress_test_role | foo | | | | | ! t2 | regress_test_role | foo | | | | | (10 rows) RESET ROLE; --- 335,353 ---- SET ROLE regress_test_role; CREATE SERVER t2 FOREIGN DATA WRAPPER foo; \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-------------------+--------+---------+---------------------------------+------------- ! s1 | foreign_data_user | foo | | | | | ! s2 | foreign_data_user | foo | | | | host 'a', dbname 'b' | ! s3 | foreign_data_user | foo | | oracle | | | ! s4 | foreign_data_user | foo | | oracle | | host 'a', dbname 'b' | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | | | 16.0 | host 'a', dbname 'b' | ! s7 | foreign_data_user | foo | | oracle | 17.0 | host 'a', dbname 'b' | ! s8 | foreign_data_user | postgresql | | | | host 'localhost', dbname 's8db' | ! t1 | regress_test_role | foo | | | | | ! t2 | regress_test_role | foo | | | | | (10 rows) RESET ROLE; *************** ALTER SERVER s3 OPTIONS (tnsname 'orcl', *** 365,385 **** GRANT USAGE ON FOREIGN SERVER s1 TO regress_test_role; GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION; \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-----------------------------------------+--------+---------+------------------------------+------------- ! s1 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 1.0 | {servername=s1} | ! | | | regress_test_role=U/foreign_data_user | | | | ! s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b} | ! s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521} | ! s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b} | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | {host=a,dbname=b} | ! | | | regress_test_role2=U*/foreign_data_user | | | | ! s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b} | ! s8 | foreign_data_user | postgresql | | | | {host=localhost,dbname=s8db} | ! t1 | regress_test_role | foo | | | | | ! t2 | regress_test_role | foo | | | | | (10 rows) SET ROLE regress_test_role; --- 365,385 ---- GRANT USAGE ON FOREIGN SERVER s1 TO regress_test_role; GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION; \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-------------------+----------------------+-----------------------------------------+--------+---------+---------------------------------+------------- ! s1 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 1.0 | servername 's1' | ! | | | regress_test_role=U/foreign_data_user | | | | ! s2 | foreign_data_user | foo | | | 1.1 | host 'a', dbname 'b' | ! s3 | foreign_data_user | foo | | oracle | | tnsname 'orcl', port '1521' | ! s4 | foreign_data_user | foo | | oracle | | host 'a', dbname 'b' | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | host 'a', dbname 'b' | ! | | | regress_test_role2=U*/foreign_data_user | | | | ! s7 | foreign_data_user | foo | | oracle | 17.0 | host 'a', dbname 'b' | ! s8 | foreign_data_user | postgresql | | | | host 'localhost', dbname 's8db' | ! t1 | regress_test_role | foo | | | | | ! t2 | regress_test_role | foo | | | | | (10 rows) SET ROLE regress_test_role; *************** ERROR: role "regress_test_indirect" can *** 416,436 **** DETAIL: owner of server s1 privileges for foreign-data wrapper foo \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-----------------------+----------------------+-----------------------------------------+--------+---------+---------------------------------+------------- ! s1 | regress_test_indirect | foo | foreign_data_user=U/foreign_data_user +| | 1.1 | {servername=s1} | ! | | | regress_test_role=U/foreign_data_user | | | | ! s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b} | ! s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521} | ! s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b} | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | {host=a,dbname=b} | ! | | | regress_test_role2=U*/foreign_data_user | | | | ! s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b} | ! s8 | foreign_data_user | postgresql | | | | {dbname=db1,connect_timeout=30} | ! t1 | regress_test_role | foo | | | | | ! t2 | regress_test_role | foo | | | | | (10 rows) -- DROP SERVER --- 416,436 ---- DETAIL: owner of server s1 privileges for foreign-data wrapper foo \des+ ! List of foreign servers ! Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ! ------+-----------------------+----------------------+-----------------------------------------+--------+---------+------------------------------------+------------- ! s1 | regress_test_indirect | foo | foreign_data_user=U/foreign_data_user +| | 1.1 | servername 's1' | ! | | | regress_test_role=U/foreign_data_user | | | | ! s2 | foreign_data_user | foo | | | 1.1 | host 'a', dbname 'b' | ! s3 | foreign_data_user | foo | | oracle | | tnsname 'orcl', port '1521' | ! s4 | foreign_data_user | foo | | oracle | | host 'a', dbname 'b' | ! s5 | foreign_data_user | foo | | | 15.0 | | ! s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user +| | 16.0 | host 'a', dbname 'b' | ! | | | regress_test_role2=U*/foreign_data_user | | | | ! s7 | foreign_data_user | foo | | oracle | 17.0 | host 'a', dbname 'b' | ! s8 | foreign_data_user | postgresql | | | | dbname 'db1', connect_timeout '30' | ! t1 | regress_test_role | foo | | | | | ! t2 | regress_test_role | foo | | | | | (10 rows) -- DROP SERVER *************** CREATE FOREIGN TABLE ft1 ( *** 653,673 **** COMMENT ON FOREIGN TABLE ft1 IS 'ft1'; COMMENT ON COLUMN ft1.c1 IS 'ft1.c1'; \d+ ft1 ! Foreign table "public.ft1" ! Column | Type | Modifiers | FDW Options | Storage | Description ! --------+---------+-----------+---------------------------+----------+------------- ! c1 | integer | not null | {param1=val1} | plain | ft1.c1 ! c2 | text | | {param2=val2,param3=val3} | extended | ! c3 | date | | | plain | Server: sc ! FDW Options: {"delimiter=,","quote=\""} Has OIDs: no \det+ ! List of foreign tables ! Schema | Table | Server | FDW Options | Description ! --------+-------+--------+----------------------------+------------- ! public | ft1 | sc | {"delimiter=,","quote=\""} | ft1 (1 row) CREATE INDEX id_ft1_c2 ON ft1 (c2); -- ERROR --- 653,673 ---- COMMENT ON FOREIGN TABLE ft1 IS 'ft1'; COMMENT ON COLUMN ft1.c1 IS 'ft1.c1'; \d+ ft1 ! Foreign table "public.ft1" ! Column | Type | Modifiers | FDW Options | Storage | Description ! --------+---------+-----------+------------------------------+----------+------------- ! c1 | integer | not null | param1 'val1' | plain | ft1.c1 ! c2 | text | | param2 'val2', param3 'val3' | extended | ! c3 | date | | | plain | Server: sc ! FDW Options: delimiter ',', quote '"' Has OIDs: no \det+ ! List of foreign tables ! Schema | Table | Server | FDW Options | Description ! --------+-------+--------+--------------------------+------------- ! public | ft1 | sc | delimiter ',', quote '"' | ft1 (1 row) CREATE INDEX id_ft1_c2 ON ft1 (c2); -- ERROR *************** ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 *** 705,724 **** ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); \d+ ft1 ! Foreign table "public.ft1" ! Column | Type | Modifiers | FDW Options | Storage | Description ! --------+---------+-----------+---------------------------+----------+------------- ! c1 | integer | not null | {param1=val1} | plain | ! c2 | text | | {param2=val2,param3=val3} | extended | ! c3 | date | | | plain | ! c4 | integer | | | plain | ! c6 | integer | not null | | plain | ! c7 | integer | | {p1=v1,p2=v2} | plain | ! c8 | text | | {p2=V2} | extended | ! c9 | integer | | | plain | ! c10 | integer | | {p1=v1} | plain | Server: sc ! FDW Options: {"delimiter=,","quote=\""} Has OIDs: no -- can't change the column type if it's used elsewhere --- 705,724 ---- ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2'); ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1); \d+ ft1 ! Foreign table "public.ft1" ! Column | Type | Modifiers | FDW Options | Storage | Description ! --------+---------+-----------+------------------------------+----------+------------- ! c1 | integer | not null | param1 'val1' | plain | ! c2 | text | | param2 'val2', param3 'val3' | extended | ! c3 | date | | | plain | ! c4 | integer | | | plain | ! c6 | integer | not null | | plain | ! c7 | integer | | p1 'v1', p2 'v2' | plain | ! c8 | text | | p2 'V2' | extended | ! c9 | integer | | | plain | ! c10 | integer | | p1 'v1' | plain | Server: sc ! FDW Options: delimiter ',', quote '"' Has OIDs: no -- can't change the column type if it's used elsewhere *************** ERROR: relation "ft1" does not exist *** 749,767 **** ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 ! Foreign table "foreign_schema.foreign_table_1" ! Column | Type | Modifiers | FDW Options ! ------------------+---------+-----------+--------------------------- ! foreign_column_1 | integer | not null | {param1=val1} ! c2 | text | | {param2=val2,param3=val3} c3 | date | | c4 | integer | | c6 | integer | not null | ! c7 | integer | | {p1=v1,p2=v2} ! c8 | text | | {p2=V2} ! c10 | integer | | {p1=v1} Server: sc ! FDW Options: {quote=~,escape=@} -- Information schema SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2; --- 749,767 ---- ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 ! Foreign table "foreign_schema.foreign_table_1" ! Column | Type | Modifiers | FDW Options ! ------------------+---------+-----------+------------------------------ ! foreign_column_1 | integer | not null | param1 'val1' ! c2 | text | | param2 'val2', param3 'val3' c3 | date | | c4 | integer | | c6 | integer | not null | ! c7 | integer | | p1 'v1', p2 'v2' ! c8 | text | | p2 'V2' ! c10 | integer | | p1 'v1' Server: sc ! FDW Options: quote '~', escape '@' -- Information schema SELECT * FROM information_schema.foreign_data_wrappers ORDER BY 1, 2;