81#include "utils/fmgroids.h"
130 int num_col_privileges);
134 int num_col_privileges);
138 bool all_privs,
AclMode privileges,
139 Oid objectId,
Oid grantorId,
184 Oid grantorId,
Oid ownerId)
209 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
210 errmsg(
"grant options can only be granted to roles")));
225 newer_acl =
aclupdate(new_acl, &aclitem, modechg, ownerId, behavior);
284 elog(
ERROR,
"grantable rights not supported for event triggers");
294 elog(
ERROR,
"unrecognized object type: %d", objtype);
306 if (
pg_aclmask(objtype, objectId, att_number, grantorId,
327 if (this_privileges == 0)
331 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
332 errmsg(
"no privileges were granted for column \"%s\" of relation \"%s\"",
336 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
337 errmsg(
"no privileges were granted for \"%s\"",
340 else if (!all_privs && this_privileges != privileges)
344 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
345 errmsg(
"not all privileges were granted for column \"%s\" of relation \"%s\"",
349 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED),
350 errmsg(
"not all privileges were granted for \"%s\"",
356 if (this_privileges == 0)
360 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED),
361 errmsg(
"no privileges could be revoked for column \"%s\" of relation \"%s\"",
365 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED),
366 errmsg(
"no privileges could be revoked for \"%s\"",
369 else if (!all_privs && this_privileges != privileges)
373 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED),
374 errmsg(
"not all privileges could be revoked for column \"%s\" of relation \"%s\"",
378 (
errcode(ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED),
379 errmsg(
"not all privileges could be revoked for \"%s\"",
384 return this_privileges;
395 const char *errormsg;
410 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
411 errmsg(
"grantor must be current user")));
421 switch (
stmt->targtype)
432 elog(
ERROR,
"unrecognized GrantStmt.targtype: %d",
433 (
int)
stmt->targtype);
448 foreach(cell,
stmt->grantees)
469 switch (
stmt->objtype)
479 errormsg =
gettext_noop(
"invalid privilege type %s for relation");
483 errormsg =
gettext_noop(
"invalid privilege type %s for sequence");
487 errormsg =
gettext_noop(
"invalid privilege type %s for database");
491 errormsg =
gettext_noop(
"invalid privilege type %s for domain");
495 errormsg =
gettext_noop(
"invalid privilege type %s for function");
499 errormsg =
gettext_noop(
"invalid privilege type %s for language");
503 errormsg =
gettext_noop(
"invalid privilege type %s for large object");
507 errormsg =
gettext_noop(
"invalid privilege type %s for schema");
511 errormsg =
gettext_noop(
"invalid privilege type %s for procedure");
515 errormsg =
gettext_noop(
"invalid privilege type %s for routine");
519 errormsg =
gettext_noop(
"invalid privilege type %s for tablespace");
523 errormsg =
gettext_noop(
"invalid privilege type %s for type");
527 errormsg =
gettext_noop(
"invalid privilege type %s for foreign-data wrapper");
531 errormsg =
gettext_noop(
"invalid privilege type %s for foreign server");
535 errormsg =
gettext_noop(
"invalid privilege type %s for parameter");
538 elog(
ERROR,
"unrecognized GrantStmt.objtype: %d",
539 (
int)
stmt->objtype);
560 foreach(cell,
stmt->privileges)
573 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
574 errmsg(
"column privileges are only valid for relations")));
580 elog(
ERROR,
"AccessPriv node must specify privilege or columns");
583 if (priv & ~all_privileges)
585 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
643 elog(
ERROR,
"unrecognized GrantStmt.objtype: %d",
692 foreach(cell, objnames)
709 foreach(cell, objnames)
728 foreach(cell, objnames)
746 foreach(cell, objnames)
794 foreach(cell, nspnames)
832 Anum_pg_proc_pronamespace,
839 Anum_pg_proc_prokind,
844 Anum_pg_proc_prokind,
864 elog(
ERROR,
"unrecognized GrantStmt.objtype: %d",
887 Anum_pg_class_relnamespace,
891 Anum_pg_class_relkind,
926 const char *errormsg;
929 foreach(cell,
stmt->options)
933 if (strcmp(defel->
defname,
"schemas") == 0)
939 else if (strcmp(defel->
defname,
"roles") == 0)
950 nspnames = (
List *) dnspnames->
arg;
952 rolespecs = (
List *) drolespecs->
arg;
970 foreach(cell,
action->grantees)
995 errormsg =
gettext_noop(
"invalid privilege type %s for relation");
999 errormsg =
gettext_noop(
"invalid privilege type %s for sequence");
1003 errormsg =
gettext_noop(
"invalid privilege type %s for function");
1007 errormsg =
gettext_noop(
"invalid privilege type %s for procedure");
1011 errormsg =
gettext_noop(
"invalid privilege type %s for routine");
1015 errormsg =
gettext_noop(
"invalid privilege type %s for type");
1019 errormsg =
gettext_noop(
"invalid privilege type %s for schema");
1023 errormsg =
gettext_noop(
"invalid privilege type %s for large object");
1026 elog(
ERROR,
"unrecognized GrantStmt.objtype: %d",
1048 foreach(cell,
action->privileges)
1055 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
1056 errmsg(
"default privileges cannot be set for columns")));
1059 elog(
ERROR,
"AccessPriv node must specify privilege");
1062 if (priv & ~all_privileges)
1064 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
1071 if (rolespecs ==
NIL)
1083 foreach(rolecell, rolespecs)
1091 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1092 errmsg(
"permission denied to change default privileges")));
1107 if (nspnames ==
NIL)
1119 foreach(nspcell, nspnames)
1183 objtype = DEFACLOBJ_RELATION;
1189 objtype = DEFACLOBJ_SEQUENCE;
1195 objtype = DEFACLOBJ_FUNCTION;
1201 objtype = DEFACLOBJ_TYPE;
1209 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
1210 errmsg(
"cannot use IN SCHEMA clause when using %s",
1211 "GRANT/REVOKE ON SCHEMAS")));
1212 objtype = DEFACLOBJ_NAMESPACE;
1220 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
1221 errmsg(
"cannot use IN SCHEMA clause when using %s",
1222 "GRANT/REVOKE ON LARGE OBJECTS")));
1223 objtype = DEFACLOBJ_LARGEOBJECT;
1229 elog(
ERROR,
"unrecognized object type: %d",
1247 Anum_pg_default_acl_defaclacl,
1261 if (old_acl != NULL)
1268 noldmembers =
aclmembers(old_acl, &oldmembers);
1311 myself.
classId = DefaultAclRelationId;
1321 bool nulls[Natts_pg_default_acl] = {0};
1322 bool replaces[Natts_pg_default_acl] = {0};
1329 Anum_pg_default_acl_oid);
1345 replaces[Anum_pg_default_acl_defaclacl - 1] =
true;
1348 values, nulls, replaces);
1365 myself.
classId = DefaultAclRelationId;
1369 referenced.
classId = NamespaceRelationId;
1380 nnewmembers =
aclmembers(new_acl, &newmembers);
1385 noldmembers, oldmembers,
1386 nnewmembers, newmembers);
1424 if (classid == DefaultAclRelationId)
1437 Anum_pg_default_acl_oid,
1447 elog(
ERROR,
"could not find tuple for default ACL %u", objid);
1451 iacls.
roleid = pg_default_acl_tuple->defaclrole;
1452 iacls.
nspid = pg_default_acl_tuple->defaclnamespace;
1454 switch (pg_default_acl_tuple->defaclobjtype)
1456 case DEFACLOBJ_RELATION:
1459 case DEFACLOBJ_SEQUENCE:
1462 case DEFACLOBJ_FUNCTION:
1465 case DEFACLOBJ_TYPE:
1468 case DEFACLOBJ_NAMESPACE:
1471 case DEFACLOBJ_LARGEOBJECT:
1476 elog(
ERROR,
"unexpected default ACL type: %d",
1477 (
int) pg_default_acl_tuple->defaclobjtype);
1500 case RelationRelationId:
1504 case DatabaseRelationId:
1507 case TypeRelationId:
1510 case ProcedureRelationId:
1513 case LanguageRelationId:
1516 case LargeObjectRelationId:
1519 case NamespaceRelationId:
1522 case TableSpaceRelationId:
1525 case ForeignServerRelationId:
1528 case ForeignDataWrapperRelationId:
1531 case ParameterAclRelationId:
1535 elog(
ERROR,
"unexpected object class %u", classid);
1563 int num_col_privileges)
1567 foreach(cell, colnames)
1575 (
errcode(ERRCODE_UNDEFINED_COLUMN),
1576 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
1579 if (attnum <= 0 || attnum >= num_col_privileges)
1580 elog(
ERROR,
"column number out of range");
1581 col_privileges[
attnum] |= this_privileges;
1596 int num_col_privileges)
1602 curr_att <= classForm->relnatts;
1612 if (classForm->relkind == RELKIND_VIEW && curr_att < 0)
1619 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
1620 curr_att, table_oid);
1655 bool nulls[Natts_pg_attribute] = {0};
1656 bool replaces[Natts_pg_attribute] = {0};
1666 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
1674 aclDatum =
SysCacheGetAttr(ATTNUM, attr_tuple, Anum_pg_attribute_attacl,
1687 noldmembers =
aclmembers(old_acl, &oldmembers);
1696 merged_acl =
aclconcat(old_rel_acl, old_acl);
1700 merged_acl, ownerId,
1701 &grantorId, &avail_goptions);
1719 NameStr(pg_attribute_tuple->attname));
1727 col_privileges, grantorId,
1734 nnewmembers =
aclmembers(new_acl, &newmembers);
1752 nulls[Anum_pg_attribute_attacl - 1] =
true;
1753 need_update = !isNull;
1755 replaces[Anum_pg_attribute_attacl - 1] =
true;
1760 values, nulls, replaces);
1766 ACL_NUM(new_acl) > 0 ? new_acl : NULL);
1771 noldmembers, oldmembers,
1772 nnewmembers, newmembers);
1801 int num_col_privileges;
1802 bool have_col_privileges;
1813 elog(
ERROR,
"cache lookup failed for relation %u", relOid);
1817 if (pg_class_tuple->relkind == RELKIND_INDEX ||
1818 pg_class_tuple->relkind == RELKIND_PARTITIONED_INDEX)
1820 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1821 errmsg(
"\"%s\" is an index",
1822 NameStr(pg_class_tuple->relname))));
1825 if (pg_class_tuple->relkind == RELKIND_COMPOSITE_TYPE)
1827 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1828 errmsg(
"\"%s\" is a composite type",
1829 NameStr(pg_class_tuple->relname))));
1833 pg_class_tuple->relkind != RELKIND_SEQUENCE)
1835 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1836 errmsg(
"\"%s\" is not a sequence",
1837 NameStr(pg_class_tuple->relname))));
1842 if (pg_class_tuple->relkind == RELKIND_SEQUENCE)
1858 if (pg_class_tuple->relkind == RELKIND_SEQUENCE)
1873 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
1874 errmsg(
"sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges",
1875 NameStr(pg_class_tuple->relname))));
1890 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
1891 errmsg(
"invalid privilege type %s for table",
1904 have_col_privileges =
false;
1919 num_col_privileges);
1920 have_col_privileges =
true;
1927 ownerId = pg_class_tuple->relowner;
1932 switch (pg_class_tuple->relkind)
1934 case RELKIND_SEQUENCE:
1949 noldmembers =
aclmembers(old_acl, &oldmembers);
1953 old_rel_acl =
aclcopy(old_acl);
1965 bool nulls[Natts_pg_class] = {0};
1966 bool replaces[Natts_pg_class] = {0};
1974 &grantorId, &avail_goptions);
1976 switch (pg_class_tuple->relkind)
1978 case RELKIND_SEQUENCE:
1993 relOid, grantorId, objtype,
1994 NameStr(pg_class_tuple->relname),
2013 nnewmembers =
aclmembers(new_acl, &newmembers);
2016 replaces[Anum_pg_class_relacl - 1] =
true;
2020 values, nulls, replaces);
2031 noldmembers, oldmembers,
2032 nnewmembers, newmembers);
2044 foreach(cell_colprivs, istmt->
col_privs)
2055 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
2056 errmsg(
"invalid privilege type %s for column",
2059 if (pg_class_tuple->relkind == RELKIND_SEQUENCE &&
2068 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
2069 errmsg(
"sequence \"%s\" only supports SELECT column privileges",
2070 NameStr(pg_class_tuple->relname))));
2078 num_col_privileges);
2079 have_col_privileges =
true;
2082 if (have_col_privileges)
2086 for (
i = 0;
i < num_col_privileges;
i++)
2092 NameStr(pg_class_tuple->relname),
2102 pfree(col_privileges);
2159 object_check(istmt, tuple);
2183 noldmembers =
aclmembers(old_acl, &oldmembers);
2189 &grantorId, &avail_goptions);
2211 grantorId, ownerId);
2217 nnewmembers =
aclmembers(new_acl, &newmembers);
2236 noldmembers, oldmembers,
2237 nnewmembers, newmembers);
2257 if (!pg_language_tuple->lanpltrusted)
2259 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2260 errmsg(
"language \"%s\" is not trusted",
2261 NameStr(pg_language_tuple->lanname)),
2262 errdetail(
"GRANT and REVOKE are not allowed on untrusted languages, "
2263 "because only superusers can use untrusted languages.")));
2275 relation =
table_open(LargeObjectMetadataRelationId,
2292 Datum values[Natts_pg_largeobject_metadata] = {0};
2293 bool nulls[Natts_pg_largeobject_metadata] = {0};
2294 bool replaces[Natts_pg_largeobject_metadata] = {0};
2305 Anum_pg_largeobject_metadata_oid,
2310 LargeObjectMetadataOidIndexId,
true,
2315 elog(
ERROR,
"could not find tuple for large object %u", loid);
2323 ownerId = form_lo_meta->lomowner;
2325 Anum_pg_largeobject_metadata_lomacl,
2338 noldmembers =
aclmembers(old_acl, &oldmembers);
2344 &grantorId, &avail_goptions);
2350 snprintf(loname,
sizeof(loname),
"large object %u", loid);
2363 grantorId, ownerId);
2369 nnewmembers =
aclmembers(new_acl, &newmembers);
2372 replaces[Anum_pg_largeobject_metadata_lomacl - 1] =
true;
2373 values[Anum_pg_largeobject_metadata_lomacl - 1]
2377 values, nulls, replaces);
2386 form_lo_meta->oid, 0,
2388 noldmembers, oldmembers,
2389 nnewmembers, newmembers);
2410 if (IsTrueArrayType(pg_type_tuple))
2412 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
2413 errmsg(
"cannot set privileges of array types"),
2414 errhint(
"Set the privileges of the element type instead.")));
2415 if (pg_type_tuple->typtype == TYPTYPE_MULTIRANGE)
2417 (
errcode(ERRCODE_INVALID_GRANT_OPERATION),
2418 errmsg(
"cannot set privileges of multirange types"),
2419 errhint(
"Set the privileges of the range type instead.")));
2437 const char *parname;
2454 elog(
ERROR,
"cache lookup failed for parameter ACL %u",
2459 Anum_pg_parameter_acl_parname);
2463 ownerId = BOOTSTRAP_SUPERUSERID;
2470 Anum_pg_parameter_acl_paracl,
2484 noldmembers =
aclmembers(old_acl, &oldmembers);
2490 &grantorId, &avail_goptions);
2499 parameterId, grantorId,
2510 grantorId, ownerId);
2516 nnewmembers =
aclmembers(new_acl, &newmembers);
2532 bool nulls[Natts_pg_parameter_acl] = {0};
2533 bool replaces[Natts_pg_parameter_acl] = {0};
2535 replaces[Anum_pg_parameter_acl_paracl - 1] =
true;
2539 values, nulls, replaces);
2551 noldmembers, oldmembers,
2552 nnewmembers, newmembers);
2568 if (strcmp(privname,
"insert") == 0)
2570 if (strcmp(privname,
"select") == 0)
2572 if (strcmp(privname,
"update") == 0)
2574 if (strcmp(privname,
"delete") == 0)
2576 if (strcmp(privname,
"truncate") == 0)
2578 if (strcmp(privname,
"references") == 0)
2580 if (strcmp(privname,
"trigger") == 0)
2582 if (strcmp(privname,
"execute") == 0)
2584 if (strcmp(privname,
"usage") == 0)
2586 if (strcmp(privname,
"create") == 0)
2588 if (strcmp(privname,
"temporary") == 0)
2590 if (strcmp(privname,
"temp") == 0)
2592 if (strcmp(privname,
"connect") == 0)
2594 if (strcmp(privname,
"set") == 0)
2596 if (strcmp(privname,
"alter system") == 0)
2598 if (strcmp(privname,
"maintain") == 0)
2601 (
errcode(ERRCODE_SYNTAX_ERROR),
2602 errmsg(
"unrecognized privilege type \"%s\"", privname)));
2622 return "REFERENCES";
2638 return "ALTER SYSTEM";
2642 elog(
ERROR,
"unrecognized privilege: %d", (
int) privilege);
2655 const char *objectname)
2664 const char *msg =
"???";
2669 msg =
gettext_noop(
"permission denied for aggregate %s");
2672 msg =
gettext_noop(
"permission denied for collation %s");
2678 msg =
gettext_noop(
"permission denied for conversion %s");
2681 msg =
gettext_noop(
"permission denied for database %s");
2687 msg =
gettext_noop(
"permission denied for event trigger %s");
2690 msg =
gettext_noop(
"permission denied for extension %s");
2693 msg =
gettext_noop(
"permission denied for foreign-data wrapper %s");
2696 msg =
gettext_noop(
"permission denied for foreign server %s");
2699 msg =
gettext_noop(
"permission denied for foreign table %s");
2702 msg =
gettext_noop(
"permission denied for function %s");
2708 msg =
gettext_noop(
"permission denied for language %s");
2711 msg =
gettext_noop(
"permission denied for large object %s");
2714 msg =
gettext_noop(
"permission denied for materialized view %s");
2717 msg =
gettext_noop(
"permission denied for operator class %s");
2720 msg =
gettext_noop(
"permission denied for operator %s");
2723 msg =
gettext_noop(
"permission denied for operator family %s");
2726 msg =
gettext_noop(
"permission denied for parameter %s");
2732 msg =
gettext_noop(
"permission denied for procedure %s");
2735 msg =
gettext_noop(
"permission denied for publication %s");
2738 msg =
gettext_noop(
"permission denied for routine %s");
2744 msg =
gettext_noop(
"permission denied for sequence %s");
2747 msg =
gettext_noop(
"permission denied for statistics object %s");
2750 msg =
gettext_noop(
"permission denied for subscription %s");
2756 msg =
gettext_noop(
"permission denied for tablespace %s");
2759 msg =
gettext_noop(
"permission denied for text search configuration %s");
2762 msg =
gettext_noop(
"permission denied for text search dictionary %s");
2789 elog(
ERROR,
"unsupported object type: %d", objtype);
2793 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2794 errmsg(msg, objectname)));
2799 const char *msg =
"???";
2819 msg =
gettext_noop(
"must be owner of event trigger %s");
2825 msg =
gettext_noop(
"must be owner of foreign-data wrapper %s");
2828 msg =
gettext_noop(
"must be owner of foreign server %s");
2831 msg =
gettext_noop(
"must be owner of foreign table %s");
2843 msg =
gettext_noop(
"must be owner of large object %s");
2846 msg =
gettext_noop(
"must be owner of materialized view %s");
2849 msg =
gettext_noop(
"must be owner of operator class %s");
2855 msg =
gettext_noop(
"must be owner of operator family %s");
2870 msg =
gettext_noop(
"must be owner of subscription %s");
2885 msg =
gettext_noop(
"must be owner of statistics object %s");
2891 msg =
gettext_noop(
"must be owner of text search configuration %s");
2894 msg =
gettext_noop(
"must be owner of text search dictionary %s");
2927 elog(
ERROR,
"unsupported object type: %d", objtype);
2931 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2932 errmsg(msg, objectname)));
2936 elog(
ERROR,
"unrecognized AclResult: %d", (
int) aclerr);
2944 const char *objectname,
const char *colname)
2953 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2954 errmsg(
"permission denied for column \"%s\" of relation \"%s\"",
2955 colname, objectname)));
2962 elog(
ERROR,
"unrecognized AclResult: %d", (
int) aclerr);
2998 return object_aclmask(DatabaseRelationId, object_oid, roleid, mask, how);
3000 return object_aclmask(ProcedureRelationId, object_oid, roleid, mask, how);
3002 return object_aclmask(LanguageRelationId, object_oid, roleid, mask, how);
3009 return object_aclmask(NamespaceRelationId, object_oid, roleid, mask, how);
3011 elog(
ERROR,
"grantable rights not supported for statistics objects");
3015 return object_aclmask(TableSpaceRelationId, object_oid, roleid, mask, how);
3017 return object_aclmask(ForeignDataWrapperRelationId, object_oid, roleid, mask, how);
3019 return object_aclmask(ForeignServerRelationId, object_oid, roleid, mask, how);
3021 elog(
ERROR,
"grantable rights not supported for event triggers");
3025 return object_aclmask(TypeRelationId, object_oid, roleid, mask, how);
3027 elog(
ERROR,
"unrecognized object type: %d",
3072 case NamespaceRelationId:
3075 case TypeRelationId:
3081 Assert(classid != RelationRelationId);
3082 Assert(classid != LargeObjectMetadataRelationId);
3098 if (is_missing != NULL)
3105 elog(
ERROR,
"cache lookup failed for %s %u",
3119 aclDatum = (
Datum) 0;
3127 result =
aclmask(acl, roleid, ownerId, mask, how);
3179 if (is_missing != NULL)
3187 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3188 errmsg(
"attribute %d of relation with OID %u does not exist",
3195 if (attributeForm->attisdropped)
3197 if (is_missing != NULL)
3206 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3207 errmsg(
"attribute %d of relation with OID %u does not exist",
3211 aclDatum =
SysCacheGetAttr(ATTNUM, attTuple, Anum_pg_attribute_attacl,
3236 if (is_missing != NULL)
3245 errmsg(
"relation with OID %u does not exist",
3250 ownerId = classForm->relowner;
3257 result =
aclmask(acl, roleid, ownerId, mask, how);
3299 if (is_missing != NULL)
3308 errmsg(
"relation with OID %u does not exist",
3324 classForm->relkind != RELKIND_VIEW &&
3340 ownerId = classForm->relowner;
3347 switch (classForm->relkind)
3349 case RELKIND_SEQUENCE:
3356 aclDatum = (
Datum) 0;
3364 result =
aclmask(acl, roleid, ownerId, mask, how);
3442 Anum_pg_parameter_acl_paracl,
3448 aclDatum = (
Datum) 0;
3456 result =
aclmask(acl, roleid, BOOTSTRAP_SUPERUSERID, mask, how);
3492 (
errcode(ERRCODE_UNDEFINED_OBJECT),
3493 errmsg(
"parameter ACL with OID %u does not exist",
3497 Anum_pg_parameter_acl_paracl,
3503 aclDatum = (
Datum) 0;
3511 result =
aclmask(acl, roleid, BOOTSTRAP_SUPERUSERID, mask, how);
3556 pg_lo_meta =
table_open(LargeObjectMetadataRelationId,
3560 Anum_pg_largeobject_metadata_oid,
3565 LargeObjectMetadataOidIndexId,
true,
3566 snapshot, 1, entry);
3571 (
errcode(ERRCODE_UNDEFINED_OBJECT),
3572 errmsg(
"large object %u does not exist", lobj_oid)));
3576 aclDatum =
heap_getattr(tuple, Anum_pg_largeobject_metadata_lomacl,
3583 aclDatum = (
Datum) 0;
3591 result =
aclmask(acl, roleid, ownerId, mask, how);
3657 if (is_missing != NULL)
3665 (
errcode(ERRCODE_UNDEFINED_SCHEMA),
3666 errmsg(
"schema with OID %u does not exist", nsp_oid)));
3671 aclDatum =
SysCacheGetAttr(NAMESPACEOID, tuple, Anum_pg_namespace_nspacl,
3677 aclDatum = (
Datum) 0;
3685 result =
aclmask(acl, roleid, ownerId, mask, how);
3731 if (is_missing != NULL)
3739 (
errcode(ERRCODE_UNDEFINED_OBJECT),
3740 errmsg(
"type with OID %u does not exist",
3749 if (IsTrueArrayType(typeForm))
3751 Oid elttype_oid = typeForm->typelem;
3758 if (is_missing != NULL)
3766 (
errcode(ERRCODE_UNDEFINED_OBJECT),
3767 errmsg(
"type with OID %u does not exist",
3778 if (typeForm->typtype == TYPTYPE_MULTIRANGE)
3787 if (is_missing != NULL)
3795 (
errcode(ERRCODE_UNDEFINED_OBJECT),
3796 errmsg(
"type with OID %u does not exist",
3805 ownerId = typeForm->typowner;
3808 Anum_pg_type_typacl, &isNull);
3813 aclDatum = (
Datum) 0;
3821 result =
aclmask(acl, roleid, ownerId, mask, how);
3938 if (is_missing != NULL)
3947 errmsg(
"relation with OID %u does not exist",
3952 ownerId = classForm->relowner;
3953 nattrs = classForm->relnatts;
3963 for (curr_att = 1; curr_att <= nattrs; curr_att++)
3990 aclDatum =
SysCacheGetAttr(ATTNUM, attTuple, Anum_pg_attribute_attacl,
4100 if (classid == LargeObjectRelationId)
4101 classid = LargeObjectMetadataRelationId;
4111 elog(
ERROR,
"cache lookup failed for %s %u",
4141 elog(
ERROR,
"could not find tuple for %s %u",
4171 bool result =
false;
4190 bool result =
false;
4228 Anum_pg_default_acl_defaclacl,
4266 defaclobjtype = DEFACLOBJ_RELATION;
4270 defaclobjtype = DEFACLOBJ_SEQUENCE;
4274 defaclobjtype = DEFACLOBJ_FUNCTION;
4278 defaclobjtype = DEFACLOBJ_TYPE;
4282 defaclobjtype = DEFACLOBJ_NAMESPACE;
4286 defaclobjtype = DEFACLOBJ_LARGEOBJECT;
4298 if (glob_acl == NULL && schema_acl == NULL)
4305 if (glob_acl == NULL)
4309 result =
aclmerge(glob_acl, schema_acl, ownerId);
4363 if (classoid == RelationRelationId)
4372 elog(
ERROR,
"cache lookup failed for relation %u", objoid);
4380 if (pg_class_tuple->relkind == RELKIND_INDEX ||
4381 pg_class_tuple->relkind == RELKIND_PARTITIONED_INDEX ||
4382 pg_class_tuple->relkind == RELKIND_COMPOSITE_TYPE)
4392 if (pg_class_tuple->relkind != RELKIND_SEQUENCE)
4395 AttrNumber nattrs = pg_class_tuple->relnatts;
4397 for (curr_att = 1; curr_att <= nattrs; curr_att++)
4417 Anum_pg_attribute_attacl,
4444 else if (classoid == LargeObjectRelationId)
4463 Anum_pg_largeobject_metadata_oid,
4468 LargeObjectMetadataOidIndexId,
true,
4473 elog(
ERROR,
"could not find tuple for large object %u", objoid);
4476 Anum_pg_largeobject_metadata_lomacl,
4497 elog(
ERROR,
"cache lookup failed for %s %u",
4525 if (classoid == RelationRelationId)
4532 elog(
ERROR,
"cache lookup failed for relation %u", objoid);
4540 if (pg_class_tuple->relkind == RELKIND_INDEX ||
4541 pg_class_tuple->relkind == RELKIND_PARTITIONED_INDEX ||
4542 pg_class_tuple->relkind == RELKIND_COMPOSITE_TYPE)
4552 if (pg_class_tuple->relkind != RELKIND_SEQUENCE)
4555 AttrNumber nattrs = pg_class_tuple->relnatts;
4557 for (curr_att = 1; curr_att <= nattrs; curr_att++)
4644 nnewmembers =
aclmembers(new_acl, &newmembers);
4650 Anum_pg_init_privs_objoid,
4654 Anum_pg_init_privs_classoid,
4658 Anum_pg_init_privs_objsubid,
4672 bool nulls[Natts_pg_init_privs] = {0};
4673 bool replace[Natts_pg_init_privs] = {0};
4679 oldAclDatum =
heap_getattr(oldtuple, Anum_pg_init_privs_initprivs,
4683 noldmembers =
aclmembers(old_acl, &oldmembers);
4686 noldmembers, oldmembers,
4687 nnewmembers, newmembers);
4690 if (new_acl &&
ACL_NUM(new_acl) != 0)
4693 replace[Anum_pg_init_privs_initprivs - 1] =
true;
4709 bool nulls[Natts_pg_init_privs] = {0};
4717 if (new_acl &&
ACL_NUM(new_acl) != 0)
4725 values[Anum_pg_init_privs_privtype - 1] =
4739 noldmembers, oldmembers,
4740 nnewmembers, newmembers);
4779 Anum_pg_init_privs_objoid,
4783 Anum_pg_init_privs_classoid,
4787 Anum_pg_init_privs_objsubid,
4809 oldAclDatum =
heap_getattr(oldtuple, Anum_pg_init_privs_initprivs,
4818 new_acl =
aclnewowner(old_acl, oldroleid, newroleid);
4824 if (new_acl == NULL ||
ACL_NUM(new_acl) == 0)
4831 bool nulls[Natts_pg_init_privs] = {0};
4832 bool replaces[Natts_pg_init_privs] = {0};
4836 replaces[Anum_pg_init_privs_initprivs - 1] =
true;
4839 values, nulls, replaces);
4846 noldmembers =
aclmembers(old_acl, &oldmembers);
4847 nnewmembers =
aclmembers(new_acl, &newmembers);
4850 noldmembers, oldmembers,
4851 nnewmembers, newmembers);
4890 Anum_pg_init_privs_objoid,
4894 Anum_pg_init_privs_classoid,
4898 Anum_pg_init_privs_objsubid,
4920 oldAclDatum =
heap_getattr(oldtuple, Anum_pg_init_privs_initprivs,
4930 noldmembers =
aclmembers(old_acl, &oldmembers);
4936 elog(
ERROR,
"cache lookup failed for %s %u",
4947 if (old_acl != NULL)
4960 if (new_acl == NULL ||
ACL_NUM(new_acl) == 0)
4967 bool nulls[Natts_pg_init_privs] = {0};
4968 bool replaces[Natts_pg_init_privs] = {0};
4972 replaces[Anum_pg_init_privs_initprivs - 1] =
true;
4975 values, nulls, replaces);
4982 nnewmembers =
aclmembers(new_acl, &newmembers);
4985 noldmembers, oldmembers,
4986 nnewmembers, newmembers);
Acl * aclconcat(const Acl *left_acl, const Acl *right_acl)
Acl * aclmerge(const Acl *left_acl, const Acl *right_acl, Oid ownerId)
Acl * acldefault(ObjectType objtype, Oid ownerId)
bool aclequal(const Acl *left_acl, const Acl *right_acl)
Acl * aclupdate(const Acl *old_acl, const AclItem *mod_aip, int modechg, Oid ownerId, DropBehavior behavior)
void select_best_grantor(Oid roleId, AclMode privileges, const Acl *acl, Oid ownerId, Oid *grantorId, AclMode *grantOptions)
bool has_privs_of_role(Oid member, Oid role)
Acl * make_empty_acl(void)
int aclmembers(const Acl *acl, Oid **roleids)
Acl * aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId)
Acl * aclcopy(const Acl *orig_acl)
void aclitemsort(Acl *acl)
AclMode aclmask(const Acl *acl, Oid roleid, Oid ownerId, AclMode mask, AclMaskHow how)
Oid get_rolespec_oid(const RoleSpec *role, bool missing_ok)
#define ACLITEM_ALL_PRIV_BITS
#define ACL_ALL_RIGHTS_FOREIGN_SERVER
#define ACL_ALL_RIGHTS_TABLESPACE
#define ACL_ALL_RIGHTS_PARAMETER_ACL
#define ACL_ALL_RIGHTS_SCHEMA
#define ACL_ALL_RIGHTS_SEQUENCE
#define ACL_ALL_RIGHTS_DATABASE
#define ACL_ALL_RIGHTS_COLUMN
#define ACL_OPTION_TO_PRIVS(privs)
#define ACL_ALL_RIGHTS_FUNCTION
#define ACL_ALL_RIGHTS_LANGUAGE
#define ACL_ALL_RIGHTS_TYPE
#define ACL_ALL_RIGHTS_FDW
#define ACLITEM_SET_PRIVS_GOPTIONS(item, privs, goptions)
#define DatumGetAclPCopy(X)
#define ACL_ALL_RIGHTS_RELATION
#define ACL_ALL_RIGHTS_LARGEOBJECT
#define ACL_GRANT_OPTION_FOR(privs)
static AclMode pg_attribute_aclmask_ext(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mask, AclMaskHow how, bool *is_missing)
AclResult object_aclcheck_ext(Oid classid, Oid objectid, Oid roleid, AclMode mode, bool *is_missing)
void ExecuteGrantStmt(GrantStmt *stmt)
AclResult pg_largeobject_aclcheck_snapshot(Oid lobj_oid, Oid roleid, AclMode mode, Snapshot snapshot)
static void expand_all_col_privileges(Oid table_oid, Form_pg_class classForm, AclMode this_privileges, AclMode *col_privileges, int num_col_privileges)
void RemoveRoleFromInitPriv(Oid roleid, Oid classid, Oid objid, int32 objsubid)
static void recordExtensionInitPriv(Oid objoid, Oid classoid, int objsubid, Acl *new_acl)
static void expand_col_privileges(List *colnames, Oid table_oid, AclMode this_privileges, AclMode *col_privileges, int num_col_privileges)
bool has_bypassrls_privilege(Oid roleid)
AclResult pg_class_aclcheck_ext(Oid table_oid, Oid roleid, AclMode mode, bool *is_missing)
void aclcheck_error_col(AclResult aclerr, ObjectType objtype, const char *objectname, const char *colname)
AclResult pg_attribute_aclcheck_all_ext(Oid table_oid, Oid roleid, AclMode mode, AclMaskHow how, bool *is_missing)
void recordDependencyOnNewAcl(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, Acl *acl)
static void ExecGrant_Attribute(InternalGrant *istmt, Oid relOid, const char *relname, AttrNumber attnum, Oid ownerId, AclMode col_privileges, Relation attRelation, const Acl *old_rel_acl)
static void ExecGrant_Type_check(InternalGrant *istmt, HeapTuple tuple)
void ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *stmt)
static void ExecGrantStmt_oids(InternalGrant *istmt)
static AclMode pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid, AclMode mask, AclMaskHow how, Snapshot snapshot)
static AclMode pg_attribute_aclmask(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mask, AclMaskHow how)
static List * objectNamesToOids(ObjectType objtype, List *objnames, bool is_grant)
static AclMode pg_parameter_aclmask(const char *name, Oid roleid, AclMode mask, AclMaskHow how)
AclResult pg_attribute_aclcheck_all(Oid table_oid, Oid roleid, AclMode mode, AclMaskHow how)
static AclMode pg_parameter_acl_aclmask(Oid acl_oid, Oid roleid, AclMode mask, AclMaskHow how)
static void SetDefaultACL(InternalDefaultACL *iacls)
static List * objectsInSchemaToOids(ObjectType objtype, List *nspnames)
AclResult pg_parameter_aclcheck(const char *name, Oid roleid, AclMode mode)
void ReplaceRoleInInitPriv(Oid oldroleid, Oid newroleid, Oid classid, Oid objid, int32 objsubid)
static void ExecGrant_common(InternalGrant *istmt, Oid classid, AclMode default_privs, void(*object_check)(InternalGrant *istmt, HeapTuple tuple))
static Acl * merge_acl_with_grant(Acl *old_acl, bool is_grant, bool grant_option, DropBehavior behavior, List *grantees, AclMode privileges, Oid grantorId, Oid ownerId)
void recordExtObjInitPriv(Oid objoid, Oid classoid)
static List * getRelationsInNamespace(Oid namespaceId, char relkind)
static AclMode pg_class_aclmask_ext(Oid table_oid, Oid roleid, AclMode mask, AclMaskHow how, bool *is_missing)
static AclMode string_to_privilege(const char *privname)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
static AclMode object_aclmask(Oid classid, Oid objectid, Oid roleid, AclMode mask, AclMaskHow how)
static void ExecGrant_Largeobject(InternalGrant *istmt)
AclResult pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mode)
static AclMode restrict_and_check_grant(bool is_grant, AclMode avail_goptions, bool all_privs, AclMode privileges, Oid objectId, Oid grantorId, ObjectType objtype, const char *objname, AttrNumber att_number, const char *colname)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
static void recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, Acl *new_acl)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
AclResult pg_attribute_aclcheck_ext(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mode, bool *is_missing)
static AclMode pg_namespace_aclmask_ext(Oid nsp_oid, Oid roleid, AclMode mask, AclMaskHow how, bool *is_missing)
static void SetDefaultACLsInSchemas(InternalDefaultACL *iacls, List *nspnames)
AclMode pg_class_aclmask(Oid table_oid, Oid roleid, AclMode mask, AclMaskHow how)
static void ExecGrant_Parameter(InternalGrant *istmt)
static const char * privilege_to_string(AclMode privilege)
static Acl * get_default_acl_internal(Oid roleId, Oid nsp_oid, char objtype)
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
bool has_createrole_privilege(Oid roleid)
static void ExecGrant_Relation(InternalGrant *istmt)
static AclMode pg_type_aclmask_ext(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how, bool *is_missing)
bool binary_upgrade_record_init_privs
Acl * get_user_default_acl(ObjectType objtype, Oid ownerId, Oid nsp_oid)
void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid)
static void ExecGrant_Language_check(InternalGrant *istmt, HeapTuple tuple)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
static AclMode pg_aclmask(ObjectType objtype, Oid object_oid, AttrNumber attnum, Oid roleid, AclMode mask, AclMaskHow how)
static AclMode object_aclmask_ext(Oid classid, Oid objectid, Oid roleid, AclMode mask, AclMaskHow how, bool *is_missing)
void removeExtObjInitPriv(Oid objoid, Oid classoid)
#define InvalidAttrNumber
static Datum values[MAXATTR]
#define TextDatumGetCString(d)
#define OidIsValid(objectId)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
bool IsSystemClass(Oid relid, Form_pg_class reltuple)
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool EventTriggerSupportsObjectType(ObjectType obtype)
void EventTriggerCollectGrant(InternalGrant *istmt)
#define palloc0_array(type, count)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
char * convert_GUC_name_for_parameter_acl(const char *name)
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static void * GETSTRUCT(const HeapTupleData *tuple)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, const ItemPointerData *tid)
if(TABLE==NULL||TABLE_index==NULL)
List * lappend(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
List * lappend_oid(List *list, Oid datum)
void UnlockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
#define InplaceUpdateTupleLock
char * get_rel_name(Oid relid)
AttrNumber get_attnum(Oid relid, const char *attname)
Oid get_element_type(Oid typid)
Oid get_multirange_range(Oid multirangeOid)
TypeName * makeTypeNameFromNameList(List *names)
void pfree(void *pointer)
void * palloc0(Size size)
#define IsBootstrapProcessingMode()
Oid LookupExplicitNamespace(const char *nspname, bool missing_ok)
bool isTempNamespace(Oid namespaceId)
Oid get_namespace_oid(const char *nspname, bool missing_ok)
#define RangeVarGetRelid(relation, lockmode, missing_ok)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
AttrNumber get_object_attnum_owner(Oid class_id)
AttrNumber get_object_attnum_oid(Oid class_id)
AttrNumber get_object_attnum_name(Oid class_id)
const char * get_object_class_descr(Oid class_id)
AttrNumber get_object_attnum_acl(Oid class_id)
int get_object_catcache_oid(Oid class_id)
Oid get_object_oid_index(Oid class_id)
ObjectType get_object_type(Oid class_id, Oid object_id)
ObjectAddress get_object_address(ObjectType objtype, Node *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
@ OBJECT_PUBLICATION_NAMESPACE
@ ACL_TARGET_ALL_IN_SCHEMA
FormData_pg_attribute * Form_pg_attribute
FormData_pg_authid * Form_pg_authid
static PgChecksumMode mode
FormData_pg_class * Form_pg_class
FormData_pg_default_acl * Form_pg_default_acl
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
FormData_pg_language * Form_pg_language
#define list_make1_oid(x1)
FormData_pg_namespace * Form_pg_namespace
Oid ParameterAclLookup(const char *parameter, bool missing_ok)
Oid ParameterAclCreate(const char *parameter)
FormData_pg_proc * Form_pg_proc
void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
FormData_pg_type * Form_pg_type
#define ERRCODE_UNDEFINED_TABLE
static Datum PointerGetDatum(const void *X)
static Name DatumGetName(Datum X)
static Oid DatumGetObjectId(Datum X)
static Datum Int16GetDatum(int16 X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
#define RelationGetDescr(relation)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define BTEqualStrategyNumber
bool superuser_arg(Oid roleid)
#define FirstLowInvalidHeapAttributeNumber
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCacheLocked1(int cacheId, Datum key1)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
HeapTuple SearchSysCache3(int cacheId, Datum key1, Datum key2, Datum key3)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
text * cstring_to_text(const char *s)
void CommandCounterIncrement(void)