Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)