InterpreterDropAccessEntityQuery.cpp 2.5 KB
Newer Older
V
Vitaly Baranov 已提交
1 2 3
#include <Interpreters/InterpreterDropAccessEntityQuery.h>
#include <Parsers/ASTDropAccessEntityQuery.h>
#include <Interpreters/Context.h>
4
#include <Interpreters/DDLWorker.h>
V
Vitaly Baranov 已提交
5
#include <Access/AccessControlManager.h>
6
#include <Access/AccessFlags.h>
7 8
#include <Access/User.h>
#include <Access/Role.h>
V
Vitaly Baranov 已提交
9
#include <Access/Quota.h>
V
Vitaly Baranov 已提交
10
#include <Access/RowPolicy.h>
11
#include <Access/SettingsProfile.h>
V
Vitaly Baranov 已提交
12
#include <boost/range/algorithm/transform.hpp>
V
Vitaly Baranov 已提交
13 14 15 16


namespace DB
{
17
namespace
V
Vitaly Baranov 已提交
18 19 20
{
    using Kind = ASTDropAccessEntityQuery::Kind;

21
    std::type_index getType(Kind kind)
V
Vitaly Baranov 已提交
22
    {
23
        switch (kind)
24
        {
25 26 27 28 29
            case Kind::USER: return typeid(User);
            case Kind::ROLE: return typeid(Role);
            case Kind::QUOTA: return typeid(Quota);
            case Kind::ROW_POLICY: return typeid(RowPolicy);
            case Kind::SETTINGS_PROFILE: return typeid(SettingsProfile);
30
        }
31 32
        __builtin_unreachable();
    }
33

34 35 36
    AccessType getRequiredAccessType(Kind kind)
    {
        switch (kind)
37
        {
38 39 40
            case Kind::USER: return AccessType::DROP_USER;
            case Kind::ROLE: return AccessType::DROP_ROLE;
            case Kind::QUOTA: return AccessType::DROP_QUOTA;
41
            case Kind::ROW_POLICY: return AccessType::DROP_ROW_POLICY;
42
            case Kind::SETTINGS_PROFILE: return AccessType::DROP_SETTINGS_PROFILE;
43
        }
44 45 46
        __builtin_unreachable();
    }
}
47

48 49 50 51
BlockIO InterpreterDropAccessEntityQuery::execute()
{
    const auto & query = query_ptr->as<const ASTDropAccessEntityQuery &>();
    auto & access_control = context.getAccessControlManager();
52

53 54 55
    std::type_index type = getType(query.kind);
    context.checkAccess(getRequiredAccessType(query.kind));

56 57 58
    if (!query.cluster.empty())
        return executeDDLQueryOnCluster(query_ptr, context);

59 60 61 62 63 64 65 66 67 68 69
    if (query.kind == Kind::ROW_POLICY)
    {
        Strings full_names;
        boost::range::transform(
            query.row_policies_names, std::back_inserter(full_names),
            [this](const RowPolicy::FullNameParts & row_policy_name) { return row_policy_name.getFullName(context); });
        if (query.if_exists)
            access_control.tryRemove(access_control.find<RowPolicy>(full_names));
        else
            access_control.remove(access_control.getIDs<RowPolicy>(full_names));
        return {};
V
Vitaly Baranov 已提交
70 71
    }

72 73 74 75 76
    if (query.if_exists)
        access_control.tryRemove(access_control.find(type, query.names));
    else
        access_control.remove(access_control.getIDs(type, query.names));
    return {};
V
Vitaly Baranov 已提交
77
}
78

V
Vitaly Baranov 已提交
79
}