aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/acl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/acl.c')
-rw-r--r--src/backend/utils/adt/acl.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
index b80fc442d9f..9644afc34a2 100644
--- a/src/backend/utils/adt/acl.c
+++ b/src/backend/utils/adt/acl.c
@@ -835,6 +835,64 @@ acldefault(GrantObjectType objtype, Oid ownerId)
/*
+ * SQL-accessible version of acldefault(). Hackish mapping from "char" type to
+ * ACL_OBJECT_* values, but it's only used in the information schema, not
+ * documented for general use.
+ */
+Datum
+acldefault_sql(PG_FUNCTION_ARGS)
+{
+ char objtypec = PG_GETARG_CHAR(0);
+ Oid owner = PG_GETARG_OID(1);
+ GrantObjectType objtype = 0;
+
+ switch (objtypec)
+ {
+ case 'c':
+ objtype = ACL_OBJECT_COLUMN;
+ break;
+ case 'r':
+ objtype = ACL_OBJECT_RELATION;
+ break;
+ case 's':
+ objtype = ACL_OBJECT_SEQUENCE;
+ break;
+ case 'd':
+ objtype = ACL_OBJECT_DATABASE;
+ break;
+ case 'f':
+ objtype = ACL_OBJECT_FUNCTION;
+ break;
+ case 'l':
+ objtype = ACL_OBJECT_LANGUAGE;
+ break;
+ case 'L':
+ objtype = ACL_OBJECT_LARGEOBJECT;
+ break;
+ case 'n':
+ objtype = ACL_OBJECT_NAMESPACE;
+ break;
+ case 't':
+ objtype = ACL_OBJECT_TABLESPACE;
+ break;
+ case 'F':
+ objtype = ACL_OBJECT_FDW;
+ break;
+ case 'S':
+ objtype = ACL_OBJECT_FOREIGN_SERVER;
+ break;
+ case 'T':
+ objtype = ACL_OBJECT_TYPE;
+ break;
+ default:
+ elog(ERROR, "unrecognized objtype abbreviation: %c", objtypec);
+ }
+
+ PG_RETURN_ACL_P(acldefault(objtype, owner));
+}
+
+
+/*
* Update an ACL array to add or remove specified privileges.
*
* old_acl: the input ACL array