diff --git a/doc/src/sgml/ref/grant.sgml b/doc/src/sgml/ref/grant.sgml index ff64c7a3ba..90850f185d 100644 --- a/doc/src/sgml/ref/grant.sgml +++ b/doc/src/sgml/ref/grant.sgml @@ -573,20 +573,22 @@ GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw; If the Access privileges column is empty for a given object, - it means the object has default privileges (that is, its privileges column - is null). Default privileges always include all privileges for the owner, - and can include some privileges for PUBLIC depending on the - object type, as explained above. The first GRANT or - REVOKE on an object - will instantiate the default privileges (producing, for example, - {miriam=arwdDxt/miriam}) and then modify them per the - specified request. Similarly, entries are shown in Column access - privileges only for columns with nondefault privileges. - (Note: for this purpose, default privileges always means the - built-in default privileges for the object's type. An object whose - privileges have been affected by an ALTER DEFAULT PRIVILEGES - command will always be shown with an explicit privilege entry that - includes the effects of the ALTER.) + it means the object has no privileges, i.e. all privileges have been revoked. + + + + + In previous versions of PostgreSQL, an empty Access privileges + column could mean either that the object had no provileges, or that it has + the default privileges for the object's type. + This ambiguity is fixed starting from PostgreSQL 12. + + + + + Entries in Column access privileges show per-column + access privileges added to the table's access privileges already + outlined in Access privileges. diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 80d8338b96..097d137b09 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -41,7 +41,7 @@ static bool listTSConfigsVerbose(const char *pattern); static bool describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname, const char *pnspname, const char *prsname); -static void printACLColumn(PQExpBuffer buf, const char *colname); +static void printACLColumn(PQExpBuffer buf, const char *colname, const char *kind, const char *rolname, const char *ddp_type); static bool listOneExtensionContents(const char *extname, const char *oid); @@ -233,16 +233,16 @@ describeTablespaces(const char *pattern, bool verbose) if (pset.sversion >= 90200) printfPQExpBuffer(&buf, - "SELECT spcname AS \"%s\",\n" - " pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n" - " pg_catalog.pg_tablespace_location(oid) AS \"%s\"", + "SELECT ts.spcname AS \"%s\",\n" + " pg_catalog.pg_get_userbyid(ts.spcowner) AS \"%s\",\n" + " pg_catalog.pg_tablespace_location(ts.oid) AS \"%s\"", gettext_noop("Name"), gettext_noop("Owner"), gettext_noop("Location")); else printfPQExpBuffer(&buf, - "SELECT spcname AS \"%s\",\n" - " pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n" + "SELECT ts.spcname AS \"%s\",\n" + " pg_catalog.pg_get_userbyid(ts.spcowner) AS \"%s\",\n" " spclocation AS \"%s\"", gettext_noop("Name"), gettext_noop("Owner"), @@ -251,26 +251,30 @@ describeTablespaces(const char *pattern, bool verbose) if (verbose) { appendPQExpBufferStr(&buf, ",\n "); - printACLColumn(&buf, "spcacl"); + printACLColumn(&buf, "ts.spcacl", "\\db", "u.usename", NULL); } if (verbose && pset.sversion >= 90000) appendPQExpBuffer(&buf, - ",\n spcoptions AS \"%s\"", + ",\n ts.spcoptions AS \"%s\"", gettext_noop("Options")); if (verbose && pset.sversion >= 90200) appendPQExpBuffer(&buf, - ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS \"%s\"", + ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(ts.oid)) AS \"%s\"", gettext_noop("Size")); if (verbose && pset.sversion >= 80200) appendPQExpBuffer(&buf, - ",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"", + ",\n pg_catalog.shobj_description(ts.oid, 'pg_tablespace') AS \"%s\"", gettext_noop("Description")); appendPQExpBufferStr(&buf, - "\nFROM pg_catalog.pg_tablespace\n"); + "\nFROM pg_catalog.pg_tablespace ts\n"); + + if (verbose) + appendPQExpBufferStr(&buf, + "LEFT JOIN pg_catalog.pg_user u ON u.usesysid = ts.spcowner\n"); processSQLNamePattern(pset.db, &buf, pattern, false, false, NULL, "spcname", NULL, @@ -302,6 +306,7 @@ describeTablespaces(const char *pattern, bool verbose) * * a for aggregates * n for normal + * p for procedure * t for trigger * w for window * @@ -499,7 +504,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool gettext_noop("invoker"), gettext_noop("Security")); appendPQExpBufferStr(&buf, ",\n "); - printACLColumn(&buf, "p.proacl"); + printACLColumn(&buf, "p.proacl", "\\df", "u.usename", NULL); appendPQExpBuffer(&buf, ",\n l.lanname as \"%s\"" ",\n p.prosrc as \"%s\"" @@ -515,7 +520,8 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool if (verbose) appendPQExpBufferStr(&buf, - " LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang\n"); + " LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang\n" + " LEFT JOIN pg_catalog.pg_user u ON u.usesysid = p.proowner\n"); have_where = false; @@ -714,7 +720,7 @@ describeTypes(const char *pattern, bool verbose, bool showSystem) } if (verbose && pset.sversion >= 90200) { - printACLColumn(&buf, "t.typacl"); + printACLColumn(&buf, "t.typacl", "\\dT", "u.usename", NULL); appendPQExpBufferStr(&buf, ",\n "); } @@ -725,6 +731,9 @@ describeTypes(const char *pattern, bool verbose, bool showSystem) appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_type t\n" " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n"); + if (verbose && pset.sversion >= 90200) + appendPQExpBufferStr(&buf, " LEFT JOIN pg_catalog.pg_user u ON u.usesysid = t.typowner\n"); + /* * do not include complex types (typrelid!=0) unless they are standalone * composite types @@ -875,7 +884,7 @@ listAllDbs(const char *pattern, bool verbose) gettext_noop("Collate"), gettext_noop("Ctype")); appendPQExpBufferStr(&buf, " "); - printACLColumn(&buf, "d.datacl"); + printACLColumn(&buf, "d.datacl", "\\l", "u.usename", NULL); if (verbose && pset.sversion >= 80200) appendPQExpBuffer(&buf, ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n" @@ -892,7 +901,8 @@ listAllDbs(const char *pattern, bool verbose) ",\n pg_catalog.shobj_description(d.oid, 'pg_database') as \"%s\"", gettext_noop("Description")); appendPQExpBufferStr(&buf, - "\nFROM pg_catalog.pg_database d\n"); + "\nFROM pg_catalog.pg_database d\n" + "LEFT JOIN pg_catalog.pg_user u ON u.usesysid = d.datdba\n"); if (verbose && pset.sversion >= 80000) appendPQExpBufferStr(&buf, " JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid\n"); @@ -957,7 +967,7 @@ permissionsList(const char *pattern) gettext_noop("table"), /* partitioned table */ gettext_noop("Type")); - printACLColumn(&buf, "c.relacl"); + printACLColumn(&buf, "c.relacl", "c.relkind", "u.usename", NULL); if (pset.sversion >= 80400) appendPQExpBuffer(&buf, @@ -1035,6 +1045,7 @@ permissionsList(const char *pattern) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_class c\n" " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n" + " LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner\n" "WHERE c.relkind IN (" CppAsString2(RELKIND_RELATION) "," CppAsString2(RELKIND_VIEW) "," @@ -1121,10 +1132,11 @@ listDefaultACLs(const char *pattern) gettext_noop("schema"), gettext_noop("Type")); - printACLColumn(&buf, "d.defaclacl"); + printACLColumn(&buf, "d.defaclacl", "\\ddp", "u.usename", "d.defaclobjtype"); appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_default_acl d\n" - " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace\n"); + " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace\n" + " LEFT JOIN pg_catalog.pg_user u ON u.usesysid = d.defaclrole\n"); processSQLNamePattern(pset.db, &buf, pattern, false, false, NULL, @@ -3673,7 +3685,7 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) if (pset.sversion >= 90000) appendPQExpBuffer(&buf, "l.laninline::pg_catalog.regprocedure AS \"%s\",\n ", gettext_noop("Inline handler")); - printACLColumn(&buf, "l.lanacl"); + printACLColumn(&buf, "l.lanacl", "\\dL", "u.usename", NULL); } appendPQExpBuffer(&buf, @@ -3684,6 +3696,9 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) " AND d.objsubid = 0\n", gettext_noop("Description")); + if (verbose) + appendPQExpBufferStr(&buf, "LEFT JOIN pg_catalog.pg_user u ON u.usesysid = l.lanowner\n"); + if (pattern) processSQLNamePattern(pset.db, &buf, pattern, false, false, NULL, "l.lanname", NULL, NULL); @@ -3752,7 +3767,7 @@ listDomains(const char *pattern, bool verbose, bool showSystem) if (pset.sversion >= 90200) { appendPQExpBufferStr(&buf, ",\n "); - printACLColumn(&buf, "t.typacl"); + printACLColumn(&buf, "t.typacl", "\\dD", "pg_catalog.pg_get_userbyid(t.typowner)", NULL); } appendPQExpBuffer(&buf, ",\n d.description as \"%s\"", @@ -4143,7 +4158,7 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) if (verbose) { appendPQExpBufferStr(&buf, ",\n "); - printACLColumn(&buf, "n.nspacl"); + printACLColumn(&buf, "n.nspacl", "\\dn", "pg_catalog.pg_get_userbyid(n.nspowner)", NULL); appendPQExpBuffer(&buf, ",\n pg_catalog.obj_description(n.oid, 'pg_namespace') AS \"%s\"", gettext_noop("Description")); @@ -4812,7 +4827,7 @@ listForeignDataWrappers(const char *pattern, bool verbose) if (verbose) { appendPQExpBufferStr(&buf, ",\n "); - printACLColumn(&buf, "fdwacl"); + printACLColumn(&buf, "fdwacl", "\\dew", "pg_catalog.pg_get_userbyid(fdw.fdwowner)", NULL); appendPQExpBuffer(&buf, ",\n CASE WHEN fdwoptions IS NULL THEN '' ELSE " " '(' || pg_catalog.array_to_string(ARRAY(SELECT " @@ -4890,7 +4905,7 @@ listForeignServers(const char *pattern, bool verbose) if (verbose) { appendPQExpBufferStr(&buf, ",\n "); - printACLColumn(&buf, "s.srvacl"); + printACLColumn(&buf, "s.srvacl", "\\des", "pg_catalog.pg_get_userbyid(s.srvowner)", NULL); appendPQExpBuffer(&buf, ",\n" " s.srvtype AS \"%s\",\n" @@ -5548,6 +5563,60 @@ describeSubscriptions(const char *pattern, bool verbose) return true; } +static void +getACLDefault(PQExpBuffer buf, const char *kind, const char *rolname, const char *ddp_type) +{ + char *ext = pset.sversion >= 80100 ? "E" : ""; + + if (strcmp(kind, "\\df") == 0) /* function */ + appendPQExpBuffer(buf, "%s'=X/' || %s || %s'\\n' || %s || %s'=X/' || %s\n", + ext, rolname, ext, rolname, ext, rolname); + else if (strcmp(kind, "\\l") == 0) /* list of catalogs (database) */ + appendPQExpBuffer(buf, "%s'=Tc/' || %s || %s'\\n' || %s || %s'=CTc/' || %s\n", + ext, rolname, ext, rolname, ext, rolname); + else if (strcmp(kind, "\\dT") == 0 || + strcmp(kind, "\\dL") == 0) /* type & language */ + appendPQExpBuffer(buf, "%s'=U/' || %s || %s'\\n' || %s || %s'=U/' || %s\n", + ext, rolname, ext, rolname, ext, rolname); + else if (strcmp(kind, "\\db") == 0) /* tablespace */ + appendPQExpBuffer(buf, "%s || %s'=C/' || %s\n", rolname, ext, rolname); + else if (strcmp(kind, "\\dn") == 0) /* schema (namespace) */ + appendPQExpBuffer(buf, "%s || %s'=UC/' || %s\n", rolname, ext, rolname); + else if (strcmp(kind, "\\des") == 0 || strcmp(kind, "\\dew") == 0 || + strcmp(kind, "\\dD") == 0) /* foreign server/data wrapper, domain */ + appendPQExpBuffer(buf, "%s || %s'=U/' || %s\n", rolname, ext, rolname); + else if (strcmp(kind, "\\ddp") == 0) /* default acl */ + { + /* ddp defaclacl IS NULL means hardcoded, so recurse */ + appendPQExpBuffer(buf, "CASE %s WHEN 'r' THEN ", ddp_type); + getACLDefault(buf, "'r'", rolname, NULL); + appendPQExpBufferStr(buf, " WHEN 'S' THEN "); + getACLDefault(buf, "'S'", rolname, NULL); + appendPQExpBufferStr(buf, " WHEN 'f' THEN "); + getACLDefault(buf, "\\df", rolname, NULL); + appendPQExpBufferStr(buf, " WHEN 'T' THEN "); + getACLDefault(buf, "\\dT", rolname, NULL); + appendPQExpBufferStr(buf, " WHEN 'n' THEN "); + getACLDefault(buf, "\\dn", rolname, NULL); + appendPQExpBufferStr(buf, " ELSE NULL END"); + } + else /* relation like */ + appendPQExpBuffer(buf, + "%s || '=' || CASE" + /* relation-like objects */ + " WHEN %s = " CppAsString2(RELKIND_SEQUENCE) " THEN 'rwU'" + " WHEN %s IN (" + CppAsString2(RELKIND_RELATION) "," + CppAsString2(RELKIND_VIEW) "," + CppAsString2(RELKIND_MATVIEW) "," + CppAsString2(RELKIND_FOREIGN_TABLE) "," + CppAsString2(RELKIND_PARTITIONED_TABLE) + ") THEN 'arwdDxt'" + " ELSE NULL" + " END || '/' || %s\n", + rolname, kind, kind, rolname); +} + /* * printACLColumn * @@ -5556,14 +5625,15 @@ describeSubscriptions(const char *pattern, bool verbose) * whitespace or comma decoration. */ static void -printACLColumn(PQExpBuffer buf, const char *colname) +printACLColumn(PQExpBuffer buf, const char *aclcol, const char *kind, const char *rolname, const char * ddp_type) { - if (pset.sversion >= 80100) - appendPQExpBuffer(buf, - "pg_catalog.array_to_string(%s, E'\\n') AS \"%s\"", - colname, gettext_noop("Access privileges")); - else - appendPQExpBuffer(buf, - "pg_catalog.array_to_string(%s, '\\n') AS \"%s\"", - colname, gettext_noop("Access privileges")); + Assert(kind != NULL && rolname != NULL); + appendPQExpBuffer(buf, + "CASE\n" + " WHEN %s IS NULL THEN\n", aclcol); + getACLDefault(buf, kind, rolname, ddp_type); + appendPQExpBuffer(buf, + " ELSE pg_catalog.array_to_string(%s, %s'\\n')", + aclcol, pset.sversion >= 80100 ? "E" : ""); + appendPQExpBuffer(buf, " END AS \"%s\"", gettext_noop("Access privileges")); } diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index 75365501d4..effc9f05f0 100644 --- a/src/test/regress/expected/foreign_data.out +++ b/src/test/regress/expected/foreign_data.out @@ -52,12 +52,12 @@ ERROR: foreign-data wrapper "foo" already exists DROP FOREIGN DATA WRAPPER foo; CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1'); \dew+ - List of foreign-data wrappers - Name | Owner | Handler | Validator | Access privileges | FDW options | Description -------------+---------------------------+---------+--------------------------+-------------------+---------------+------------- - dummy | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | (testing '1') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+---------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | (testing '1') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) DROP FOREIGN DATA WRAPPER foo; @@ -65,12 +65,12 @@ CREATE FOREIGN DATA WRAPPER foo OPTIONS (testing '1', testing '2'); -- ERROR 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 | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | (testing '1', another '2') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+----------------------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | (testing '1', another '2') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) DROP FOREIGN DATA WRAPPER foo; @@ -81,12 +81,12 @@ HINT: Must be superuser to create a foreign-data wrapper. RESET ROLE; CREATE FOREIGN DATA WRAPPER foo VALIDATOR postgresql_fdw_validator; \dew+ - List of foreign-data wrappers - Name | Owner | Handler | Validator | Access privileges | FDW options | Description -------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- - dummy | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | postgresql_fdw_validator | | | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) -- HANDLER related checks @@ -106,12 +106,12 @@ ALTER FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR ERROR: function bar(text[], oid) does not exist ALTER FOREIGN DATA WRAPPER foo NO VALIDATOR; \dew+ - List of foreign-data wrappers - Name | Owner | Handler | Validator | Access privileges | FDW options | Description -------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- - dummy | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OPTIONS (a '1', b '2'); @@ -121,34 +121,34 @@ ALTER FOREIGN DATA WRAPPER foo OPTIONS (DROP c); -- ERROR ERROR: option "c" not found 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 | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | (a '1', b '2') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+----------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | (a '1', b '2') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (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 | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | (b '3', c '4') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+----------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | (b '3', c '4') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (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 | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | (b '3', c '4', a '2') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+-----------------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | (b '3', c '4', a '2') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) SET ROLE regress_test_role; @@ -158,12 +158,12 @@ HINT: Must be superuser to alter a foreign-data wrapper. 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 | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | (b '3', c '4', a '2', d '5') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) ALTER FOREIGN DATA WRAPPER foo OWNER TO regress_test_role; -- ERROR @@ -177,22 +177,22 @@ ERROR: permission denied to alter foreign-data wrapper "foo" 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 | regress_foreign_data_user | - | - | | | useless - foo | regress_test_role_super | - | - | | (b '3', c '4', a '2', d '5') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_test_role_super | - | - | regress_test_role_super=U/regress_test_role_super | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) ALTER FOREIGN DATA WRAPPER foo RENAME TO foo1; \dew+ - List of foreign-data wrappers - Name | Owner | Handler | Validator | Access privileges | FDW options | Description -------------+---------------------------+---------+--------------------------+-------------------+------------------------------+------------- - dummy | regress_foreign_data_user | - | - | | | useless - foo1 | regress_test_role_super | - | - | | (b '3', c '4', a '2', d '5') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo1 | regress_test_role_super | - | - | regress_test_role_super=U/regress_test_role_super | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) ALTER FOREIGN DATA WRAPPER foo1 RENAME TO foo; @@ -210,12 +210,12 @@ ERROR: foreign-data wrapper "nonexistent" does not exist 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 | regress_foreign_data_user | - | - | | | useless - foo | regress_test_role_super | test_fdw_handler | - | | (b '3', c '4', a '2', d '5') | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+------------------+--------------------------+-------------------------------------------------------+------------------------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_test_role_super | test_fdw_handler | - | regress_test_role_super=U/regress_test_role_super | (b '3', c '4', a '2', d '5') | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) DROP ROLE regress_test_role_super; -- ERROR @@ -226,11 +226,11 @@ DROP FOREIGN DATA WRAPPER foo; RESET ROLE; DROP ROLE regress_test_role_super; \dew+ - List of foreign-data wrappers - Name | Owner | Handler | Validator | Access privileges | FDW options | Description -------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- - dummy | regress_foreign_data_user | - | - | | | useless - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (2 rows) CREATE FOREIGN DATA WRAPPER foo; @@ -242,19 +242,19 @@ ERROR: user mapping for "regress_foreign_data_user" already exists for server s CREATE USER MAPPING IF NOT EXISTS FOR current_user SERVER s1; -- NOTICE NOTICE: user mapping for "regress_foreign_data_user" already exists for server s1, skipping \dew+ - List of foreign-data wrappers - Name | Owner | Handler | Validator | Access privileges | FDW options | Description -------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- - dummy | regress_foreign_data_user | - | - | | | useless - foo | regress_foreign_data_user | - | - | | | - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + foo | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (3 rows) \des+ - List of foreign servers - Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description -------+---------------------------+----------------------+-------------------+------+---------+-------------+---------------- - s1 | regress_foreign_data_user | foo | | | | | foreign server + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------------------------------------------+------+---------+-------------+---------------- + s1 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | | | foreign server (1 row) \deu+ @@ -278,11 +278,11 @@ NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to server s1 drop cascades to user mapping for regress_foreign_data_user on server s1 \dew+ - List of foreign-data wrappers - Name | Owner | Handler | Validator | Access privileges | FDW options | Description -------------+---------------------------+---------+--------------------------+-------------------+-------------+------------- - dummy | regress_foreign_data_user | - | - | | | useless - postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | | | + List of foreign-data wrappers + Name | Owner | Handler | Validator | Access privileges | FDW options | Description +------------+---------------------------+---------+--------------------------+-------------------------------------------------------+-------------+------------- + dummy | regress_foreign_data_user | - | - | regress_foreign_data_user=U/regress_foreign_data_user | | useless + postgresql | regress_foreign_data_user | - | postgresql_fdw_validator | regress_foreign_data_user=U/regress_foreign_data_user | | (2 rows) \des+ @@ -317,17 +317,17 @@ ERROR: invalid option "foo" 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 | regress_foreign_data_user | foo | | | | | - s2 | regress_foreign_data_user | foo | | | | (host 'a', dbname 'b') | - s3 | regress_foreign_data_user | foo | | oracle | | | - s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | - s5 | regress_foreign_data_user | foo | | | 15.0 | | - s6 | regress_foreign_data_user | foo | | | 16.0 | (host 'a', dbname 'b') | - s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | - s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+-----------------------------------+------------- + s1 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | | | + s2 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | | + s4 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 15.0 | | + s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 16.0 | (host 'a', dbname 'b') | + s7 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | regress_foreign_data_user=U/regress_foreign_data_user | | | (host 'localhost', dbname 's8db') | (8 rows) SET ROLE regress_test_role; @@ -339,18 +339,18 @@ SET ROLE regress_test_role; 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 | regress_foreign_data_user | foo | | | | | - s2 | regress_foreign_data_user | foo | | | | (host 'a', dbname 'b') | - s3 | regress_foreign_data_user | foo | | oracle | | | - s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | - s5 | regress_foreign_data_user | foo | | | 15.0 | | - s6 | regress_foreign_data_user | foo | | | 16.0 | (host 'a', dbname 'b') | - s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | - s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | - t1 | regress_test_role | foo | | | | | + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+-----------------------------------+------------- + s1 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | | | + s2 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | | + s4 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 15.0 | | + s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 16.0 | (host 'a', dbname 'b') | + s7 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | regress_foreign_data_user=U/regress_foreign_data_user | | | (host 'localhost', dbname 's8db') | + t1 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | (9 rows) REVOKE USAGE ON FOREIGN DATA WRAPPER foo FROM regress_test_role; @@ -363,19 +363,19 @@ GRANT regress_test_indirect TO regress_test_role; 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 | regress_foreign_data_user | foo | | | | | - s2 | regress_foreign_data_user | foo | | | | (host 'a', dbname 'b') | - s3 | regress_foreign_data_user | foo | | oracle | | | - s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | - s5 | regress_foreign_data_user | foo | | | 15.0 | | - s6 | regress_foreign_data_user | foo | | | 16.0 | (host 'a', dbname 'b') | - s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | - s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | - t1 | regress_test_role | foo | | | | | - t2 | regress_test_role | foo | | | | | + List of foreign servers + Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description +------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+-----------------------------------+------------- + s1 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | | | + s2 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | | + s4 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 15.0 | | + s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 16.0 | (host 'a', dbname 'b') | + s7 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | regress_foreign_data_user=U/regress_foreign_data_user | | | (host 'localhost', dbname 's8db') | + t1 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | + t2 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | (10 rows) RESET ROLE; @@ -398,16 +398,16 @@ GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION; ------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+-----------------------------------+------------- s1 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 1.0 | (servername 's1') | | | | regress_test_role=U/regress_foreign_data_user | | | | - s2 | regress_foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') | - s3 | regress_foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') | - s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | - s5 | regress_foreign_data_user | foo | | | 15.0 | | + s2 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 1.1 | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | ("tns name" 'orcl', port '1521') | + s4 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 15.0 | | s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 16.0 | (host 'a', dbname 'b') | | | | regress_test_role2=U*/regress_foreign_data_user | | | | - s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | - s8 | regress_foreign_data_user | postgresql | | | | (host 'localhost', dbname 's8db') | - t1 | regress_test_role | foo | | | | | - t2 | regress_test_role | foo | | | | | + s7 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | regress_foreign_data_user=U/regress_foreign_data_user | | | (host 'localhost', dbname 's8db') | + t1 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | + t2 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | (10 rows) SET ROLE regress_test_role; @@ -448,16 +448,16 @@ privileges for foreign-data wrapper foo Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description ------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+--------------------------------------+------------- s1 | regress_test_indirect | foo | regress_test_indirect=U/regress_test_indirect | | 1.1 | (servername 's1') | - s2 | regress_foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') | - s3 | regress_foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') | - s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | - s5 | regress_foreign_data_user | foo | | | 15.0 | | + s2 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 1.1 | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | ("tns name" 'orcl', port '1521') | + s4 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 15.0 | | s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 16.0 | (host 'a', dbname 'b') | | | | regress_test_role2=U*/regress_foreign_data_user | | | | - s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | - s8 | regress_foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') | - t1 | regress_test_role | foo | | | | | - t2 | regress_test_role | foo | | | | | + s7 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | 17.0 | (host 'a', dbname 'b') | + s8 | regress_foreign_data_user | postgresql | regress_foreign_data_user=U/regress_foreign_data_user | | | (dbname 'db1', connect_timeout '30') | + t1 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | + t2 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | (10 rows) ALTER SERVER s8 RENAME to s8new; @@ -466,16 +466,16 @@ ALTER SERVER s8 RENAME to s8new; Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description -------+---------------------------+----------------------+-------------------------------------------------------+--------+---------+--------------------------------------+------------- s1 | regress_test_indirect | foo | regress_test_indirect=U/regress_test_indirect | | 1.1 | (servername 's1') | - s2 | regress_foreign_data_user | foo | | | 1.1 | (host 'a', dbname 'b') | - s3 | regress_foreign_data_user | foo | | oracle | | ("tns name" 'orcl', port '1521') | - s4 | regress_foreign_data_user | foo | | oracle | | (host 'a', dbname 'b') | - s5 | regress_foreign_data_user | foo | | | 15.0 | | + s2 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 1.1 | (host 'a', dbname 'b') | + s3 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | ("tns name" 'orcl', port '1521') | + s4 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | | (host 'a', dbname 'b') | + s5 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | | 15.0 | | s6 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user+| | 16.0 | (host 'a', dbname 'b') | | | | regress_test_role2=U*/regress_foreign_data_user | | | | - s7 | regress_foreign_data_user | foo | | oracle | 17.0 | (host 'a', dbname 'b') | - s8new | regress_foreign_data_user | postgresql | | | | (dbname 'db1', connect_timeout '30') | - t1 | regress_test_role | foo | | | | | - t2 | regress_test_role | foo | | | | | + s7 | regress_foreign_data_user | foo | regress_foreign_data_user=U/regress_foreign_data_user | oracle | 17.0 | (host 'a', dbname 'b') | + s8new | regress_foreign_data_user | postgresql | regress_foreign_data_user=U/regress_foreign_data_user | | | (dbname 'db1', connect_timeout '30') | + t1 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | + t2 | regress_test_role | foo | regress_test_role=U/regress_test_role | | | | (10 rows) ALTER SERVER s8new RENAME to s8; diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 3818cfea7e..79a790b0a8 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -3243,3 +3243,124 @@ last error message: division by zero \echo 'last error code:' :LAST_ERROR_SQLSTATE last error code: 22012 \unset FETCH_COUNT +-- various \d* default permission tests +CREATE USER d_test_user; +CREATE GROUP d_test_group; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + GRANT ALL ON SCHEMAS TO GROUP d_test_group WITH GRANT OPTION; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + GRANT USAGE ON SCHEMAS TO PUBLIC; +\ddp + Default access privileges + Owner | Schema | Type | Access privileges +-------------+--------+--------+------------------------------- + d_test_user | | schema | =U/d_test_user + + | | | d_test_user=UC/d_test_user + + | | | d_test_group=U*C*/d_test_user +(1 row) + +CREATE TABLE dp_test_table(id SERIAL PRIMARY KEY, stuff TEXT NOT NULL); +ALTER TABLE dp_test_table OWNER TO d_test_user; +GRANT SELECT (stuff) ON dp_test_table TO PUBLIC; +\dp dp_test_table + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+---------------+-------+---------------------------------+-------------------+---------- + public | dp_test_table | table | d_test_user=arwdDxt/d_test_user | stuff: +| + | | | | =r/d_test_user | +(1 row) + +CREATE FUNCTION df_test_function() RETURNS INT AS 'SELECT 1;' LANGUAGE SQL; +ALTER FUNCTION df_test_function() OWNER TO d_test_user; +\df df_test_function + List of functions + Schema | Name | Result data type | Argument data types | Type +--------+------------------+------------------+---------------------+------ + public | df_test_function | integer | | func +(1 row) + +\df+ df_test_function + List of functions + Schema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Source code | Description +--------+------------------+------------------+---------------------+------+------------+----------+-------------+----------+---------------------------+----------+-------------+------------- + public | df_test_function | integer | | func | volatile | unsafe | d_test_user | invoker | =X/d_test_user +| sql | SELECT 1; | + | | | | | | | | | d_test_user=X/d_test_user | | | +(1 row) + +CREATE DOMAIN dD_test_domain AS INTEGER CHECK(VALUE > 18); +ALTER DOMAIN dD_test_domain OWNER TO d_test_user; +\dD dD_test_domain + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+----------------+---------+-----------+----------+---------+-------------------- + public | dd_test_domain | integer | | | | CHECK (VALUE > 18) +(1 row) + +\dD+ dD_test_domain + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check | Access privileges | Description +--------+----------------+---------+-----------+----------+---------+--------------------+---------------------------+------------- + public | dd_test_domain | integer | | | | CHECK (VALUE > 18) | d_test_user=U/d_test_user | +(1 row) + +CREATE TYPE dT_test_type AS ENUM ('PostgreSQL'); +ALTER TYPE dT_test_type OWNER TO d_test_user; +\dT dT_test_type + List of data types + Schema | Name | Description +--------+--------------+------------- + public | dt_test_type | +(1 row) + +\dT+ dT_test_type + List of data types + Schema | Name | Internal name | Size | Elements | Owner | Access privileges | Description +--------+--------------+---------------+------+------------+-------------+---------------------------+------------- + public | dt_test_type | dt_test_type | 4 | PostgreSQL | d_test_user | =U/d_test_user +| + | | | | | | d_test_user=U/d_test_user | +(1 row) + +CREATE SCHEMA dn_test_schema; +ALTER SCHEMA dn_test_schema OWNER TO d_test_user; +GRANT ALL ON SCHEMA dn_test_schema TO PUBLIC; +\dn dn_test_schema + List of schemas + Name | Owner +----------------+------------- + dn_test_schema | d_test_user +(1 row) + +\dn+ dn_test_schema + List of schemas + Name | Owner | Access privileges | Description +----------------+-------------+----------------------------+------------- + dn_test_schema | d_test_user | d_test_user=UC/d_test_user+| + | | =UC/d_test_user | +(1 row) + +CREATE DATABASE l_test_database; +ALTER DATABASE l_test_database OWNER TO d_test_user; +GRANT ALL ON DATABASE l_test_database TO GROUP d_test_group; +\l l_test_database + List of databases + Name | Owner | Encoding | Collate | Ctype | Access privileges +-----------------+-------------+----------+-------------+-------------+------------------------------ + l_test_database | d_test_user | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/d_test_user + + | | | | | d_test_user=CTc/d_test_user + + | | | | | d_test_group=CTc/d_test_user +(1 row) + +-- not tested (here): \dL \db \des \dew +-- cleanup \d* tests +DROP DATABASE l_test_database; +DROP SCHEMA dn_test_schema; +DROP TYPE dT_test_type; +DROP DOMAIN dD_test_domain; +DROP FUNCTION df_test_function(); +DROP TABLE dp_test_table; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + REVOKE ALL ON SCHEMAS FROM GROUP d_test_group; +DROP GROUP d_test_group; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + REVOKE ALL ON SCHEMAS FROM PUBLIC; +DROP USER d_test_user; diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index b45da9bb8d..ab6f0146fa 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -688,3 +688,52 @@ select 1/(15-unique2) from tenk1 order by unique2 limit 19; \echo 'last error code:' :LAST_ERROR_SQLSTATE \unset FETCH_COUNT + +-- various \d* default permission tests +CREATE USER d_test_user; +CREATE GROUP d_test_group; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + GRANT ALL ON SCHEMAS TO GROUP d_test_group WITH GRANT OPTION; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + GRANT USAGE ON SCHEMAS TO PUBLIC; +\ddp +CREATE TABLE dp_test_table(id SERIAL PRIMARY KEY, stuff TEXT NOT NULL); +ALTER TABLE dp_test_table OWNER TO d_test_user; +GRANT SELECT (stuff) ON dp_test_table TO PUBLIC; +\dp dp_test_table +CREATE FUNCTION df_test_function() RETURNS INT AS 'SELECT 1;' LANGUAGE SQL; +ALTER FUNCTION df_test_function() OWNER TO d_test_user; +\df df_test_function +\df+ df_test_function +CREATE DOMAIN dD_test_domain AS INTEGER CHECK(VALUE > 18); +ALTER DOMAIN dD_test_domain OWNER TO d_test_user; +\dD dD_test_domain +\dD+ dD_test_domain +CREATE TYPE dT_test_type AS ENUM ('PostgreSQL'); +ALTER TYPE dT_test_type OWNER TO d_test_user; +\dT dT_test_type +\dT+ dT_test_type +CREATE SCHEMA dn_test_schema; +ALTER SCHEMA dn_test_schema OWNER TO d_test_user; +GRANT ALL ON SCHEMA dn_test_schema TO PUBLIC; +\dn dn_test_schema +\dn+ dn_test_schema +CREATE DATABASE l_test_database; +ALTER DATABASE l_test_database OWNER TO d_test_user; +GRANT ALL ON DATABASE l_test_database TO GROUP d_test_group; +\l l_test_database +-- not tested (here): \dL \db \des \dew + +-- cleanup \d* tests +DROP DATABASE l_test_database; +DROP SCHEMA dn_test_schema; +DROP TYPE dT_test_type; +DROP DOMAIN dD_test_domain; +DROP FUNCTION df_test_function(); +DROP TABLE dp_test_table; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + REVOKE ALL ON SCHEMAS FROM GROUP d_test_group; +DROP GROUP d_test_group; +ALTER DEFAULT PRIVILEGES FOR USER d_test_user + REVOKE ALL ON SCHEMAS FROM PUBLIC; +DROP USER d_test_user;