| 32 | |
| 33 | |
| 34 | BlockIO InterpreterCreateRoleQuery::execute() |
| 35 | { |
| 36 | const auto & query = query_ptr->as<const ASTCreateRoleQuery &>(); |
| 37 | auto & access_control = getContext()->getAccessControlManager(); |
| 38 | if (query.alter) |
| 39 | getContext()->checkAccess(AccessType::ALTER_ROLE); |
| 40 | else |
| 41 | getContext()->checkAccess(AccessType::CREATE_ROLE); |
| 42 | |
| 43 | // if (!query.cluster.empty()) |
| 44 | // return executeDDLQueryOnCluster(query_ptr, getContext()); |
| 45 | |
| 46 | std::optional<SettingsProfileElements> settings_from_query; |
| 47 | if (query.settings) |
| 48 | settings_from_query = SettingsProfileElements{*query.settings, access_control}; |
| 49 | |
| 50 | if (query.alter) |
| 51 | { |
| 52 | auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr |
| 53 | { |
| 54 | auto updated_role = typeid_cast<std::shared_ptr<Role>>(entity->clone()); |
| 55 | updateRoleFromQueryImpl(*updated_role, query, {}, settings_from_query); |
| 56 | return updated_role; |
| 57 | }; |
| 58 | if (query.if_exists) |
| 59 | { |
| 60 | auto ids = access_control.find<Role>(query.names); |
| 61 | access_control.tryUpdate(ids, update_func); |
| 62 | } |
| 63 | else |
| 64 | access_control.update(access_control.getIDs<Role>(query.names), update_func); |
| 65 | } |
| 66 | else |
| 67 | { |
| 68 | std::vector<AccessEntityPtr> new_roles; |
| 69 | for (const auto & name : query.names) |
| 70 | { |
| 71 | auto new_role = std::make_shared<Role>(); |
| 72 | updateRoleFromQueryImpl(*new_role, query, name, settings_from_query); |
| 73 | new_roles.emplace_back(std::move(new_role)); |
| 74 | } |
| 75 | |
| 76 | if (query.if_not_exists) |
| 77 | access_control.tryInsert(new_roles); |
| 78 | else if (query.or_replace) |
| 79 | access_control.insertOrReplace(new_roles); |
| 80 | else |
| 81 | access_control.insert(new_roles); |
| 82 | } |
| 83 | |
| 84 | return {}; |
| 85 | } |
| 86 | |
| 87 | |
| 88 | void InterpreterCreateRoleQuery::updateRoleFromQuery(Role & role, const ASTCreateRoleQuery & query) |
nothing calls this directly
no test coverage detected