| 42 | |
| 43 | |
| 44 | BlockIO InterpreterCreateRowPolicyQuery::execute() |
| 45 | { |
| 46 | auto & query = query_ptr->as<ASTCreateRowPolicyQuery &>(); |
| 47 | auto & access_control = getContext()->getAccessControlManager(); |
| 48 | getContext()->checkAccess(query.alter ? AccessType::ALTER_ROW_POLICY : AccessType::CREATE_ROW_POLICY); |
| 49 | |
| 50 | if (!query.cluster.empty()) |
| 51 | { |
| 52 | query.replaceCurrentUserTag(getContext()->getUserName()); |
| 53 | return executeDDLQueryOnCluster(query_ptr, getContext()); |
| 54 | } |
| 55 | |
| 56 | assert(query.names->cluster.empty()); |
| 57 | std::optional<RolesOrUsersSet> roles_from_query; |
| 58 | if (query.roles) |
| 59 | roles_from_query = RolesOrUsersSet{*query.roles, access_control, getContext()->getUserID()}; |
| 60 | |
| 61 | query.replaceEmptyDatabase(getContext()->getCurrentDatabase()); |
| 62 | |
| 63 | if (query.alter) |
| 64 | { |
| 65 | auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr |
| 66 | { |
| 67 | auto updated_policy = typeid_cast<std::shared_ptr<RowPolicy>>(entity->clone()); |
| 68 | updateRowPolicyFromQueryImpl(*updated_policy, query, {}, roles_from_query); |
| 69 | return updated_policy; |
| 70 | }; |
| 71 | Strings names = query.names->toStrings(); |
| 72 | if (query.if_exists) |
| 73 | { |
| 74 | auto ids = access_control.find<RowPolicy>(names); |
| 75 | access_control.tryUpdate(ids, update_func); |
| 76 | } |
| 77 | else |
| 78 | access_control.update(access_control.getIDs<RowPolicy>(names), update_func); |
| 79 | } |
| 80 | else |
| 81 | { |
| 82 | std::vector<AccessEntityPtr> new_policies; |
| 83 | for (const auto & name_parts : query.names->name_parts) |
| 84 | { |
| 85 | auto new_policy = std::make_shared<RowPolicy>(); |
| 86 | updateRowPolicyFromQueryImpl(*new_policy, query, name_parts, roles_from_query); |
| 87 | new_policies.emplace_back(std::move(new_policy)); |
| 88 | } |
| 89 | |
| 90 | if (query.if_not_exists) |
| 91 | access_control.tryInsert(new_policies); |
| 92 | else if (query.or_replace) |
| 93 | access_control.insertOrReplace(new_policies); |
| 94 | else |
| 95 | access_control.insert(new_policies); |
| 96 | } |
| 97 | |
| 98 | return {}; |
| 99 | } |
| 100 | |
| 101 |
nothing calls this directly
no test coverage detected