| 75 | |
| 76 | |
| 77 | BlockIO InterpreterCreateQuotaQuery::execute() |
| 78 | { |
| 79 | auto & query = query_ptr->as<ASTCreateQuotaQuery &>(); |
| 80 | auto & access_control = getContext()->getAccessControlManager(); |
| 81 | getContext()->checkAccess(query.alter ? AccessType::ALTER_QUOTA : AccessType::CREATE_QUOTA); |
| 82 | |
| 83 | // if (!query.cluster.empty()) |
| 84 | // { |
| 85 | // query.replaceCurrentUserTag(getContext()->getUserName()); |
| 86 | // return executeDDLQueryOnCluster(query_ptr, getContext()); |
| 87 | // } |
| 88 | |
| 89 | std::optional<RolesOrUsersSet> roles_from_query; |
| 90 | if (query.roles) |
| 91 | roles_from_query = RolesOrUsersSet{*query.roles, access_control, getContext()->getUserID()}; |
| 92 | |
| 93 | if (query.alter) |
| 94 | { |
| 95 | auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr |
| 96 | { |
| 97 | auto updated_quota = typeid_cast<std::shared_ptr<Quota>>(entity->clone()); |
| 98 | updateQuotaFromQueryImpl(*updated_quota, query, {}, roles_from_query); |
| 99 | return updated_quota; |
| 100 | }; |
| 101 | if (query.if_exists) |
| 102 | { |
| 103 | auto ids = access_control.find<Quota>(query.names); |
| 104 | access_control.tryUpdate(ids, update_func); |
| 105 | } |
| 106 | else |
| 107 | access_control.update(access_control.getIDs<Quota>(query.names), update_func); |
| 108 | } |
| 109 | else |
| 110 | { |
| 111 | std::vector<AccessEntityPtr> new_quotas; |
| 112 | for (const String & name : query.names) |
| 113 | { |
| 114 | auto new_quota = std::make_shared<Quota>(); |
| 115 | updateQuotaFromQueryImpl(*new_quota, query, name, roles_from_query); |
| 116 | new_quotas.emplace_back(std::move(new_quota)); |
| 117 | } |
| 118 | |
| 119 | if (query.if_not_exists) |
| 120 | access_control.tryInsert(new_quotas); |
| 121 | else if (query.or_replace) |
| 122 | access_control.insertOrReplace(new_quotas); |
| 123 | else |
| 124 | access_control.insert(new_quotas); |
| 125 | } |
| 126 | |
| 127 | return {}; |
| 128 | } |
| 129 | |
| 130 | |
| 131 | void InterpreterCreateQuotaQuery::updateQuotaFromQuery(Quota & quota, const ASTCreateQuotaQuery & query) |
nothing calls this directly
no test coverage detected