20110812_fdw_option_format.patch

text/plain

Filename: 20110812_fdw_option_format.patch
Type: text/plain
Part: 0
Message: Change format of FDW options used in \d* commands (was: Re: per-column FDW options, v5)
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;