Skip to content

Commit 2e25413

Browse files
committed
Make more use of RoleSpec struct
Most code was casting this through a generic Node. By declaring everything as RoleSpec appropriately, we can remove a bunch of casts and ad-hoc node type checking. Reviewed-by: Alvaro Herrera <alvherre@2ndquadrant.com>
1 parent f0774ab commit 2e25413

File tree

7 files changed

+41
-54
lines changed

7 files changed

+41
-54
lines changed

src/backend/catalog/aclchk.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ ExecuteGrantStmt(GrantStmt *stmt)
423423
grantee_uid = ACL_ID_PUBLIC;
424424
break;
425425
default:
426-
grantee_uid = get_rolespec_oid((Node *) grantee, false);
426+
grantee_uid = get_rolespec_oid(grantee, false);
427427
break;
428428
}
429429
istmt.grantees = lappend_oid(istmt.grantees, grantee_uid);
@@ -922,7 +922,7 @@ ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *s
922922
grantee_uid = ACL_ID_PUBLIC;
923923
break;
924924
default:
925-
grantee_uid = get_rolespec_oid((Node *) grantee, false);
925+
grantee_uid = get_rolespec_oid(grantee, false);
926926
break;
927927
}
928928
iacls.grantees = lappend_oid(iacls.grantees, grantee_uid);
@@ -1012,7 +1012,7 @@ ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *s
10121012
{
10131013
RoleSpec *rolespec = lfirst(rolecell);
10141014

1015-
iacls.roleid = get_rolespec_oid((Node *) rolespec, false);
1015+
iacls.roleid = get_rolespec_oid(rolespec, false);
10161016

10171017
/*
10181018
* We insist that calling user be a member of each target role. If

src/backend/commands/policy.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ policy_role_list_to_array(List *roles, int *num_roles)
177177
}
178178
else
179179
role_oids[i++] =
180-
ObjectIdGetDatum(get_rolespec_oid((Node *) spec, false));
180+
ObjectIdGetDatum(get_rolespec_oid(spec, false));
181181
}
182182

183183
return role_oids;

src/backend/commands/user.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
449449
foreach(item, addroleto)
450450
{
451451
RoleSpec *oldrole = lfirst(item);
452-
HeapTuple oldroletup = get_rolespec_tuple((Node *) oldrole);
452+
HeapTuple oldroletup = get_rolespec_tuple(oldrole);
453453
Oid oldroleid = HeapTupleGetOid(oldroletup);
454454
char *oldrolename = NameStr(((Form_pg_authid) GETSTRUCT(oldroletup))->rolname);
455455

@@ -1396,9 +1396,11 @@ roleSpecsToIds(List *memberNames)
13961396

13971397
foreach(l, memberNames)
13981398
{
1399-
Node *rolespec = (Node *) lfirst(l);
1399+
RoleSpec *rolespec = (RoleSpec *) lfirst(l);
14001400
Oid roleid;
14011401

1402+
Assert(IsA(rolespec, RoleSpec));
1403+
14021404
roleid = get_rolespec_oid(rolespec, false);
14031405
result = lappend_oid(result, roleid);
14041406
}
@@ -1493,7 +1495,7 @@ AddRoleMems(const char *rolename, Oid roleid,
14931495
ereport(ERROR,
14941496
(errcode(ERRCODE_INVALID_GRANT_OPERATION),
14951497
(errmsg("role \"%s\" is a member of role \"%s\"",
1496-
rolename, get_rolespec_name((Node *) memberRole)))));
1498+
rolename, get_rolespec_name(memberRole)))));
14971499

14981500
/*
14991501
* Check if entry for this role/member already exists; if so, give
@@ -1508,7 +1510,7 @@ AddRoleMems(const char *rolename, Oid roleid,
15081510
{
15091511
ereport(NOTICE,
15101512
(errmsg("role \"%s\" is already a member of role \"%s\"",
1511-
get_rolespec_name((Node *) memberRole), rolename)));
1513+
get_rolespec_name(memberRole), rolename)));
15121514
ReleaseSysCache(authmem_tuple);
15131515
continue;
15141516
}
@@ -1619,7 +1621,7 @@ DelRoleMems(const char *rolename, Oid roleid,
16191621
{
16201622
ereport(WARNING,
16211623
(errmsg("role \"%s\" is not a member of role \"%s\"",
1622-
get_rolespec_name((Node *) memberRole), rolename)));
1624+
get_rolespec_name(memberRole), rolename)));
16231625
continue;
16241626
}
16251627

src/backend/parser/gram.y

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ static Node *makeBitStringConst(char *str, int location);
144144
static Node *makeNullAConst(int location);
145145
static Node *makeAConst(Value *v, int location);
146146
static Node *makeBoolAConst(bool state, int location);
147-
static Node *makeRoleSpec(RoleSpecType type, int location);
147+
static RoleSpec *makeRoleSpec(RoleSpecType type, int location);
148148
static void check_qualified_name(List *names, core_yyscan_t yyscanner);
149149
static List *check_func_name(List *names, core_yyscan_t yyscanner);
150150
static List *check_indirection(List *indirection, core_yyscan_t yyscanner);
@@ -231,6 +231,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
231231
PartitionElem *partelem;
232232
PartitionSpec *partspec;
233233
PartitionRangeDatum *partrange_datum;
234+
RoleSpec *rolespec;
234235
}
235236

236237
%type <node> stmt schema_stmt
@@ -339,7 +340,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
339340
%type <list> RowSecurityDefaultToRole RowSecurityOptionalToRole
340341

341342
%type <str> iso_level opt_encoding
342-
%type <node> grantee
343+
%type <rolespec> grantee
343344
%type <list> grantee_list
344345
%type <accesspriv> privilege
345346
%type <list> privileges privilege_list
@@ -506,7 +507,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
506507
%type <str> NonReservedWord NonReservedWord_or_Sconst
507508
%type <str> createdb_opt_name
508509
%type <node> var_value zone_value
509-
%type <node> auth_ident RoleSpec opt_granted_by
510+
%type <rolespec> auth_ident RoleSpec opt_granted_by
510511

511512
%type <keyword> unreserved_keyword type_func_name_keyword
512513
%type <keyword> col_name_keyword reserved_keyword
@@ -522,7 +523,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
522523
%type <list> constraints_set_list
523524
%type <boolean> constraints_set_mode
524525
%type <str> OptTableSpace OptConsTableSpace
525-
%type <node> OptTableSpaceOwner
526+
%type <rolespec> OptTableSpaceOwner
526527
%type <ival> opt_check_option
527528

528529
%type <str> opt_provider security_label
@@ -13918,10 +13919,10 @@ RoleSpec: NonReservedWord
1391813919
}
1391913920
else
1392013921
{
13921-
n = (RoleSpec *) makeRoleSpec(ROLESPEC_CSTRING, @1);
13922+
n = makeRoleSpec(ROLESPEC_CSTRING, @1);
1392213923
n->rolename = pstrdup($1);
1392313924
}
13924-
$$ = (Node *) n;
13925+
$$ = n;
1392513926
}
1392613927
| CURRENT_USER
1392713928
{
@@ -14644,15 +14645,15 @@ makeBoolAConst(bool state, int location)
1464414645
/* makeRoleSpec
1464514646
* Create a RoleSpec with the given type
1464614647
*/
14647-
static Node *
14648+
static RoleSpec *
1464814649
makeRoleSpec(RoleSpecType type, int location)
1464914650
{
1465014651
RoleSpec *spec = makeNode(RoleSpec);
1465114652

1465214653
spec->roletype = type;
1465314654
spec->location = location;
1465414655

14655-
return (Node *) spec;
14656+
return spec;
1465614657
}
1465714658

1465814659
/* check_qualified_name --- check the result of qualified_name production

src/backend/utils/adt/acl.c

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5143,15 +5143,10 @@ get_role_oid_or_public(const char *rolname)
51435143
* case must check the case separately.
51445144
*/
51455145
Oid
5146-
get_rolespec_oid(const Node *node, bool missing_ok)
5146+
get_rolespec_oid(const RoleSpec *role, bool missing_ok)
51475147
{
5148-
RoleSpec *role;
51495148
Oid oid;
51505149

5151-
if (!IsA(node, RoleSpec))
5152-
elog(ERROR, "invalid node type %d", node->type);
5153-
5154-
role = (RoleSpec *) node;
51555150
switch (role->roletype)
51565151
{
51575152
case ROLESPEC_CSTRING:
@@ -5186,15 +5181,10 @@ get_rolespec_oid(const Node *node, bool missing_ok)
51865181
* Caller must ReleaseSysCache when done with the result tuple.
51875182
*/
51885183
HeapTuple
5189-
get_rolespec_tuple(const Node *node)
5184+
get_rolespec_tuple(const RoleSpec *role)
51905185
{
5191-
RoleSpec *role;
51925186
HeapTuple tuple;
51935187

5194-
role = (RoleSpec *) node;
5195-
if (!IsA(node, RoleSpec))
5196-
elog(ERROR, "invalid node type %d", node->type);
5197-
51985188
switch (role->roletype)
51995189
{
52005190
case ROLESPEC_CSTRING:
@@ -5235,13 +5225,13 @@ get_rolespec_tuple(const Node *node)
52355225
* Given a RoleSpec, returns a palloc'ed copy of the corresponding role's name.
52365226
*/
52375227
char *
5238-
get_rolespec_name(const Node *node)
5228+
get_rolespec_name(const RoleSpec *role)
52395229
{
52405230
HeapTuple tp;
52415231
Form_pg_authid authForm;
52425232
char *rolename;
52435233

5244-
tp = get_rolespec_tuple(node);
5234+
tp = get_rolespec_tuple(role);
52455235
authForm = (Form_pg_authid) GETSTRUCT(tp);
52465236
rolename = pstrdup(NameStr(authForm->rolname));
52475237
ReleaseSysCache(tp);
@@ -5257,17 +5247,11 @@ get_rolespec_name(const Node *node)
52575247
* message is provided.
52585248
*/
52595249
void
5260-
check_rolespec_name(const Node *node, const char *detail_msg)
5250+
check_rolespec_name(const RoleSpec *role, const char *detail_msg)
52615251
{
5262-
RoleSpec *role;
5263-
5264-
if (!node)
5252+
if (!role)
52655253
return;
52665254

5267-
role = (RoleSpec *) node;
5268-
5269-
Assert(IsA(node, RoleSpec));
5270-
52715255
if (role->roletype != ROLESPEC_CSTRING)
52725256
return;
52735257

src/include/nodes/parsenodes.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,7 +1542,7 @@ typedef struct CreateSchemaStmt
15421542
{
15431543
NodeTag type;
15441544
char *schemaname; /* the name of the schema to create */
1545-
Node *authrole; /* the owner of the created schema */
1545+
RoleSpec *authrole; /* the owner of the created schema */
15461546
List *schemaElts; /* schema components (list of parsenodes) */
15471547
bool if_not_exists; /* just do nothing if schema already exists? */
15481548
} CreateSchemaStmt;
@@ -1647,7 +1647,7 @@ typedef struct AlterTableCmd /* one subcommand of an ALTER TABLE */
16471647
AlterTableType subtype; /* Type of table alteration to apply */
16481648
char *name; /* column, constraint, or trigger to act on,
16491649
* or tablespace */
1650-
Node *newowner; /* RoleSpec */
1650+
RoleSpec *newowner;
16511651
Node *def; /* definition of new column, index,
16521652
* constraint, or parent table */
16531653
DropBehavior behavior; /* RESTRICT or CASCADE for DROP cases */
@@ -1766,7 +1766,7 @@ typedef struct GrantRoleStmt
17661766
List *grantee_roles; /* list of member roles to add/delete */
17671767
bool is_grant; /* true = GRANT, false = REVOKE */
17681768
bool admin_opt; /* with admin option */
1769-
Node *grantor; /* set grantor to other than current role */
1769+
RoleSpec *grantor; /* set grantor to other than current role */
17701770
DropBehavior behavior; /* drop behavior (for REVOKE) */
17711771
} GrantRoleStmt;
17721772

@@ -1981,7 +1981,7 @@ typedef struct CreateTableSpaceStmt
19811981
{
19821982
NodeTag type;
19831983
char *tablespacename;
1984-
Node *owner;
1984+
RoleSpec *owner;
19851985
char *location;
19861986
List *options;
19871987
} CreateTableSpaceStmt;
@@ -2107,23 +2107,23 @@ typedef struct CreateForeignTableStmt
21072107
typedef struct CreateUserMappingStmt
21082108
{
21092109
NodeTag type;
2110-
Node *user; /* user role */
2110+
RoleSpec *user; /* user role */
21112111
char *servername; /* server name */
21122112
List *options; /* generic options to server */
21132113
} CreateUserMappingStmt;
21142114

21152115
typedef struct AlterUserMappingStmt
21162116
{
21172117
NodeTag type;
2118-
Node *user; /* user role */
2118+
RoleSpec *user; /* user role */
21192119
char *servername; /* server name */
21202120
List *options; /* generic options to server */
21212121
} AlterUserMappingStmt;
21222122

21232123
typedef struct DropUserMappingStmt
21242124
{
21252125
NodeTag type;
2126-
Node *user; /* user role */
2126+
RoleSpec *user; /* user role */
21272127
char *servername; /* server name */
21282128
bool missing_ok; /* ignore missing mappings */
21292129
} DropUserMappingStmt;
@@ -2288,15 +2288,15 @@ typedef struct CreateRoleStmt
22882288
typedef struct AlterRoleStmt
22892289
{
22902290
NodeTag type;
2291-
Node *role; /* role */
2291+
RoleSpec *role; /* role */
22922292
List *options; /* List of DefElem nodes */
22932293
int action; /* +1 = add members, -1 = drop members */
22942294
} AlterRoleStmt;
22952295

22962296
typedef struct AlterRoleSetStmt
22972297
{
22982298
NodeTag type;
2299-
Node *role; /* role */
2299+
RoleSpec *role; /* role */
23002300
char *database; /* database name, or NULL */
23012301
VariableSetStmt *setstmt; /* SET or RESET subcommand */
23022302
} AlterRoleSetStmt;
@@ -2687,7 +2687,7 @@ typedef struct AlterOwnerStmt
26872687
RangeVar *relation; /* in case it's a table */
26882688
List *object; /* in case it's some other object */
26892689
List *objarg; /* argument types, if applicable */
2690-
Node *newowner; /* the new owner */
2690+
RoleSpec *newowner; /* the new owner */
26912691
} AlterOwnerStmt;
26922692

26932693

@@ -3171,7 +3171,7 @@ typedef struct ReassignOwnedStmt
31713171
{
31723172
NodeTag type;
31733173
List *roles;
3174-
Node *newrole;
3174+
RoleSpec *newrole;
31753175
} ReassignOwnedStmt;
31763176

31773177
/*

src/include/utils/acl.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,10 +231,10 @@ extern bool is_admin_of_role(Oid member, Oid role);
231231
extern void check_is_member_of_role(Oid member, Oid role);
232232
extern Oid get_role_oid(const char *rolename, bool missing_ok);
233233
extern Oid get_role_oid_or_public(const char *rolename);
234-
extern Oid get_rolespec_oid(const Node *node, bool missing_ok);
235-
extern void check_rolespec_name(const Node *node, const char *detail_msg);
236-
extern HeapTuple get_rolespec_tuple(const Node *node);
237-
extern char *get_rolespec_name(const Node *node);
234+
extern Oid get_rolespec_oid(const RoleSpec *role, bool missing_ok);
235+
extern void check_rolespec_name(const RoleSpec *role, const char *detail_msg);
236+
extern HeapTuple get_rolespec_tuple(const RoleSpec *role);
237+
extern char *get_rolespec_name(const RoleSpec *role);
238238

239239
extern void select_best_grantor(Oid roleId, AclMode privileges,
240240
const Acl *acl, Oid ownerId,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy