diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index aab5aa855d..770633aec2 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -470,20 +470,31 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt) /* * Add the new role to the specified existing roles. */ - foreach(item, addroleto) + if (addroleto) { - RoleSpec *oldrole = lfirst(item); - HeapTuple oldroletup = get_rolespec_tuple(oldrole); - Form_pg_authid oldroleform = (Form_pg_authid) GETSTRUCT(oldroletup); - Oid oldroleid = oldroleform->oid; - char *oldrolename = NameStr(oldroleform->rolname); + RoleSpec *thisrole = makeNode(RoleSpec); + List *thisrole_list = list_make1(thisrole); + List *thisrole_oidlist = list_make1_oid(roleid); - AddRoleMems(oldrolename, oldroleid, - list_make1(makeString(stmt->role)), - list_make1_oid(roleid), - GetUserId(), false); + thisrole->roletype = ROLESPEC_CSTRING; + thisrole->rolename = stmt->role; + thisrole->location = -1; - ReleaseSysCache(oldroletup); + foreach(item, addroleto) + { + RoleSpec *oldrole = lfirst(item); + HeapTuple oldroletup = get_rolespec_tuple(oldrole); + Form_pg_authid oldroleform = (Form_pg_authid) GETSTRUCT(oldroletup); + Oid oldroleid = oldroleform->oid; + char *oldrolename = NameStr(oldroleform->rolname); + + AddRoleMems(oldrolename, oldroleid, + thisrole_list, + thisrole_oidlist, + GetUserId(), false); + + ReleaseSysCache(oldroletup); + } } /* @@ -1505,7 +1516,7 @@ AddRoleMems(const char *rolename, Oid roleid, forboth(specitem, memberSpecs, iditem, memberIds) { - RoleSpec *memberRole = lfirst(specitem); + RoleSpec *memberRole = lfirst_node(RoleSpec, specitem); Oid memberid = lfirst_oid(iditem); HeapTuple authmem_tuple; HeapTuple tuple;