]> granicus.if.org Git - postgresql/commitdiff
Make more use of RoleSpec struct
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 28 Dec 2016 17:00:00 +0000 (12:00 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 29 Dec 2016 15:49:39 +0000 (10:49 -0500)
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>
src/backend/catalog/aclchk.c
src/backend/commands/policy.c
src/backend/commands/user.c
src/backend/parser/gram.y
src/backend/utils/adt/acl.c
src/include/nodes/parsenodes.h
src/include/utils/acl.h

index 3086021432ab3abed6660669ceff3415740319fa..fb6c276eaf86c1697772a4297a3f07bbf755bdb1 100644 (file)
@@ -423,7 +423,7 @@ ExecuteGrantStmt(GrantStmt *stmt)
                                grantee_uid = ACL_ID_PUBLIC;
                                break;
                        default:
-                               grantee_uid = get_rolespec_oid((Node *) grantee, false);
+                               grantee_uid = get_rolespec_oid(grantee, false);
                                break;
                }
                istmt.grantees = lappend_oid(istmt.grantees, grantee_uid);
@@ -922,7 +922,7 @@ ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *s
                                grantee_uid = ACL_ID_PUBLIC;
                                break;
                        default:
-                               grantee_uid = get_rolespec_oid((Node *) grantee, false);
+                               grantee_uid = get_rolespec_oid(grantee, false);
                                break;
                }
                iacls.grantees = lappend_oid(iacls.grantees, grantee_uid);
@@ -1012,7 +1012,7 @@ ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *s
                {
                        RoleSpec   *rolespec = lfirst(rolecell);
 
-                       iacls.roleid = get_rolespec_oid((Node *) rolespec, false);
+                       iacls.roleid = get_rolespec_oid(rolespec, false);
 
                        /*
                         * We insist that calling user be a member of each target role. If
index 6da3205c9e15d6039ee36f5db6b8c0bdcdcd9edb..3746bf1f9f13fbb812fc10d8e6ba6a232bf46cf6 100644 (file)
@@ -177,7 +177,7 @@ policy_role_list_to_array(List *roles, int *num_roles)
                }
                else
                        role_oids[i++] =
-                               ObjectIdGetDatum(get_rolespec_oid((Node *) spec, false));
+                               ObjectIdGetDatum(get_rolespec_oid(spec, false));
        }
 
        return role_oids;
index adc6b99b215d16847a6c41071e89faf4e303a455..a3521e77570e9d16ede9b44f4ff9e328b65cedb1 100644 (file)
@@ -449,7 +449,7 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
        foreach(item, addroleto)
        {
                RoleSpec   *oldrole = lfirst(item);
-               HeapTuple       oldroletup = get_rolespec_tuple((Node *) oldrole);
+               HeapTuple       oldroletup = get_rolespec_tuple(oldrole);
                Oid                     oldroleid = HeapTupleGetOid(oldroletup);
                char       *oldrolename = NameStr(((Form_pg_authid) GETSTRUCT(oldroletup))->rolname);
 
@@ -1396,9 +1396,11 @@ roleSpecsToIds(List *memberNames)
 
        foreach(l, memberNames)
        {
-               Node       *rolespec = (Node *) lfirst(l);
+               RoleSpec   *rolespec = (RoleSpec *) lfirst(l);
                Oid                     roleid;
 
+               Assert(IsA(rolespec, RoleSpec));
+
                roleid = get_rolespec_oid(rolespec, false);
                result = lappend_oid(result, roleid);
        }
@@ -1493,7 +1495,7 @@ AddRoleMems(const char *rolename, Oid roleid,
                        ereport(ERROR,
                                        (errcode(ERRCODE_INVALID_GRANT_OPERATION),
                                         (errmsg("role \"%s\" is a member of role \"%s\"",
-                                               rolename, get_rolespec_name((Node *) memberRole)))));
+                                               rolename, get_rolespec_name(memberRole)))));
 
                /*
                 * Check if entry for this role/member already exists; if so, give
@@ -1508,7 +1510,7 @@ AddRoleMems(const char *rolename, Oid roleid,
                {
                        ereport(NOTICE,
                                        (errmsg("role \"%s\" is already a member of role \"%s\"",
-                                                get_rolespec_name((Node *) memberRole), rolename)));
+                                                get_rolespec_name(memberRole), rolename)));
                        ReleaseSysCache(authmem_tuple);
                        continue;
                }
@@ -1619,7 +1621,7 @@ DelRoleMems(const char *rolename, Oid roleid,
                {
                        ereport(WARNING,
                                        (errmsg("role \"%s\" is not a member of role \"%s\"",
-                                                get_rolespec_name((Node *) memberRole), rolename)));
+                                                get_rolespec_name(memberRole), rolename)));
                        continue;
                }
 
index 834a00971a93fccd3f3516196a3a9f6e3425308b..08cf5b78f5c5c1398e2e0af52b56a29ed69477a7 100644 (file)
@@ -144,7 +144,7 @@ static Node *makeBitStringConst(char *str, int location);
 static Node *makeNullAConst(int location);
 static Node *makeAConst(Value *v, int location);
 static Node *makeBoolAConst(bool state, int location);
-static Node *makeRoleSpec(RoleSpecType type, int location);
+static RoleSpec *makeRoleSpec(RoleSpecType type, int location);
 static void check_qualified_name(List *names, core_yyscan_t yyscanner);
 static List *check_func_name(List *names, core_yyscan_t yyscanner);
 static List *check_indirection(List *indirection, core_yyscan_t yyscanner);
@@ -231,6 +231,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
        PartitionElem           *partelem;
        PartitionSpec           *partspec;
        PartitionRangeDatum     *partrange_datum;
+       RoleSpec                        *rolespec;
 }
 
 %type <node>   stmt schema_stmt
@@ -339,7 +340,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <list>   RowSecurityDefaultToRole RowSecurityOptionalToRole
 
 %type <str>            iso_level opt_encoding
-%type <node>   grantee
+%type <rolespec> grantee
 %type <list>   grantee_list
 %type <accesspriv> privilege
 %type <list>   privileges privilege_list
@@ -506,7 +507,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <str>            NonReservedWord NonReservedWord_or_Sconst
 %type <str>            createdb_opt_name
 %type <node>   var_value zone_value
-%type <node>   auth_ident RoleSpec opt_granted_by
+%type <rolespec> auth_ident RoleSpec opt_granted_by
 
 %type <keyword> unreserved_keyword type_func_name_keyword
 %type <keyword> col_name_keyword reserved_keyword
@@ -522,7 +523,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <list>   constraints_set_list
 %type <boolean> constraints_set_mode
 %type <str>            OptTableSpace OptConsTableSpace
-%type <node>   OptTableSpaceOwner
+%type <rolespec> OptTableSpaceOwner
 %type <ival>   opt_check_option
 
 %type <str>            opt_provider security_label
@@ -13918,10 +13919,10 @@ RoleSpec:     NonReservedWord
                                                }
                                                else
                                                {
-                                                       n = (RoleSpec *) makeRoleSpec(ROLESPEC_CSTRING, @1);
+                                                       n = makeRoleSpec(ROLESPEC_CSTRING, @1);
                                                        n->rolename = pstrdup($1);
                                                }
-                                               $$ = (Node *) n;
+                                               $$ = n;
                                        }
                        | CURRENT_USER
                                        {
@@ -14644,7 +14645,7 @@ makeBoolAConst(bool state, int location)
 /* makeRoleSpec
  * Create a RoleSpec with the given type
  */
-static Node *
+static RoleSpec *
 makeRoleSpec(RoleSpecType type, int location)
 {
        RoleSpec *spec = makeNode(RoleSpec);
@@ -14652,7 +14653,7 @@ makeRoleSpec(RoleSpecType type, int location)
        spec->roletype = type;
        spec->location = location;
 
-       return (Node *) spec;
+       return spec;
 }
 
 /* check_qualified_name --- check the result of qualified_name production
index 025a99e55afa434861f53e627fd687fdf45c366e..cc4e0b3f815b3dcb663f4e677b68008f598c2a5a 100644 (file)
@@ -5143,15 +5143,10 @@ get_role_oid_or_public(const char *rolname)
  * case must check the case separately.
  */
 Oid
-get_rolespec_oid(const Node *node, bool missing_ok)
+get_rolespec_oid(const RoleSpec *role, bool missing_ok)
 {
-       RoleSpec   *role;
        Oid                     oid;
 
-       if (!IsA(node, RoleSpec))
-               elog(ERROR, "invalid node type %d", node->type);
-
-       role = (RoleSpec *) node;
        switch (role->roletype)
        {
                case ROLESPEC_CSTRING:
@@ -5186,15 +5181,10 @@ get_rolespec_oid(const Node *node, bool missing_ok)
  * Caller must ReleaseSysCache when done with the result tuple.
  */
 HeapTuple
-get_rolespec_tuple(const Node *node)
+get_rolespec_tuple(const RoleSpec *role)
 {
-       RoleSpec   *role;
        HeapTuple       tuple;
 
-       role = (RoleSpec *) node;
-       if (!IsA(node, RoleSpec))
-               elog(ERROR, "invalid node type %d", node->type);
-
        switch (role->roletype)
        {
                case ROLESPEC_CSTRING:
@@ -5235,13 +5225,13 @@ get_rolespec_tuple(const Node *node)
  * Given a RoleSpec, returns a palloc'ed copy of the corresponding role's name.
  */
 char *
-get_rolespec_name(const Node *node)
+get_rolespec_name(const RoleSpec *role)
 {
        HeapTuple       tp;
        Form_pg_authid authForm;
        char       *rolename;
 
-       tp = get_rolespec_tuple(node);
+       tp = get_rolespec_tuple(role);
        authForm = (Form_pg_authid) GETSTRUCT(tp);
        rolename = pstrdup(NameStr(authForm->rolname));
        ReleaseSysCache(tp);
@@ -5257,17 +5247,11 @@ get_rolespec_name(const Node *node)
  * message is provided.
  */
 void
-check_rolespec_name(const Node *node, const char *detail_msg)
+check_rolespec_name(const RoleSpec *role, const char *detail_msg)
 {
-       RoleSpec   *role;
-
-       if (!node)
+       if (!role)
                return;
 
-       role = (RoleSpec *) node;
-
-       Assert(IsA(node, RoleSpec));
-
        if (role->roletype != ROLESPEC_CSTRING)
                return;
 
index fc532fbd432cbf35dcc1ae870e1d065b18c70755..9d8ef775e4f223471298c27bc48a39719acbc187 100644 (file)
@@ -1542,7 +1542,7 @@ typedef struct CreateSchemaStmt
 {
        NodeTag         type;
        char       *schemaname;         /* the name of the schema to create */
-       Node       *authrole;           /* the owner of the created schema */
+       RoleSpec   *authrole;           /* the owner of the created schema */
        List       *schemaElts;         /* schema components (list of parsenodes) */
        bool            if_not_exists;  /* just do nothing if schema already exists? */
 } CreateSchemaStmt;
@@ -1647,7 +1647,7 @@ typedef struct AlterTableCmd      /* one subcommand of an ALTER TABLE */
        AlterTableType subtype;         /* Type of table alteration to apply */
        char       *name;                       /* column, constraint, or trigger to act on,
                                                                 * or tablespace */
-       Node       *newowner;           /* RoleSpec */
+       RoleSpec   *newowner;
        Node       *def;                        /* definition of new column, index,
                                                                 * constraint, or parent table */
        DropBehavior behavior;          /* RESTRICT or CASCADE for DROP cases */
@@ -1766,7 +1766,7 @@ typedef struct GrantRoleStmt
        List       *grantee_roles;      /* list of member roles to add/delete */
        bool            is_grant;               /* true = GRANT, false = REVOKE */
        bool            admin_opt;              /* with admin option */
-       Node       *grantor;            /* set grantor to other than current role */
+       RoleSpec   *grantor;            /* set grantor to other than current role */
        DropBehavior behavior;          /* drop behavior (for REVOKE) */
 } GrantRoleStmt;
 
@@ -1981,7 +1981,7 @@ typedef struct CreateTableSpaceStmt
 {
        NodeTag         type;
        char       *tablespacename;
-       Node       *owner;
+       RoleSpec   *owner;
        char       *location;
        List       *options;
 } CreateTableSpaceStmt;
@@ -2107,7 +2107,7 @@ typedef struct CreateForeignTableStmt
 typedef struct CreateUserMappingStmt
 {
        NodeTag         type;
-       Node       *user;                       /* user role */
+       RoleSpec   *user;                       /* user role */
        char       *servername;         /* server name */
        List       *options;            /* generic options to server */
 } CreateUserMappingStmt;
@@ -2115,7 +2115,7 @@ typedef struct CreateUserMappingStmt
 typedef struct AlterUserMappingStmt
 {
        NodeTag         type;
-       Node       *user;                       /* user role */
+       RoleSpec   *user;                       /* user role */
        char       *servername;         /* server name */
        List       *options;            /* generic options to server */
 } AlterUserMappingStmt;
@@ -2123,7 +2123,7 @@ typedef struct AlterUserMappingStmt
 typedef struct DropUserMappingStmt
 {
        NodeTag         type;
-       Node       *user;                       /* user role */
+       RoleSpec   *user;                       /* user role */
        char       *servername;         /* server name */
        bool            missing_ok;             /* ignore missing mappings */
 } DropUserMappingStmt;
@@ -2288,7 +2288,7 @@ typedef struct CreateRoleStmt
 typedef struct AlterRoleStmt
 {
        NodeTag         type;
-       Node       *role;                       /* role */
+       RoleSpec   *role;                       /* role */
        List       *options;            /* List of DefElem nodes */
        int                     action;                 /* +1 = add members, -1 = drop members */
 } AlterRoleStmt;
@@ -2296,7 +2296,7 @@ typedef struct AlterRoleStmt
 typedef struct AlterRoleSetStmt
 {
        NodeTag         type;
-       Node       *role;                       /* role */
+       RoleSpec   *role;                       /* role */
        char       *database;           /* database name, or NULL */
        VariableSetStmt *setstmt;       /* SET or RESET subcommand */
 } AlterRoleSetStmt;
@@ -2687,7 +2687,7 @@ typedef struct AlterOwnerStmt
        RangeVar   *relation;           /* in case it's a table */
        List       *object;                     /* in case it's some other object */
        List       *objarg;                     /* argument types, if applicable */
-       Node       *newowner;           /* the new owner */
+       RoleSpec   *newowner;           /* the new owner */
 } AlterOwnerStmt;
 
 
@@ -3171,7 +3171,7 @@ typedef struct ReassignOwnedStmt
 {
        NodeTag         type;
        List       *roles;
-       Node       *newrole;
+       RoleSpec   *newrole;
 } ReassignOwnedStmt;
 
 /*
index fda75bb6180297fa9eee9fdcb51782da6e7e63ee..faadebd26a9aad5b5d9aeac734ce1d293ff9ac01 100644 (file)
@@ -231,10 +231,10 @@ extern bool is_admin_of_role(Oid member, Oid role);
 extern void check_is_member_of_role(Oid member, Oid role);
 extern Oid     get_role_oid(const char *rolename, bool missing_ok);
 extern Oid     get_role_oid_or_public(const char *rolename);
-extern Oid     get_rolespec_oid(const Node *node, bool missing_ok);
-extern void check_rolespec_name(const Node *node, const char *detail_msg);
-extern HeapTuple get_rolespec_tuple(const Node *node);
-extern char *get_rolespec_name(const Node *node);
+extern Oid     get_rolespec_oid(const RoleSpec *role, bool missing_ok);
+extern void check_rolespec_name(const RoleSpec *role, const char *detail_msg);
+extern HeapTuple get_rolespec_tuple(const RoleSpec *role);
+extern char *get_rolespec_name(const RoleSpec *role);
 
 extern void select_best_grantor(Oid roleId, AclMode privileges,
                                        const Acl *acl, Oid ownerId,