ParserRolesOrUsersSet.cpp 3.9 KB
Newer Older
1
#include <Parsers/ParserRolesOrUsersSet.h>
V
Vitaly Baranov 已提交
2
#include <Parsers/CommonParsers.h>
3 4
#include <Parsers/ExpressionElementParsers.h>
#include <Parsers/ASTLiteral.h>
5
#include <Parsers/ASTRolesOrUsersSet.h>
6
#include <Parsers/parseUserName.h>
7
#include <Parsers/ExpressionListParsers.h>
V
Vitaly Baranov 已提交
8 9 10 11 12
#include <boost/range/algorithm/find.hpp>


namespace DB
{
13
namespace
V
Vitaly Baranov 已提交
14
{
15 16 17 18 19
    bool parseRoleNameOrID(
        IParserBase::Pos & pos,
        Expected & expected,
        bool id_mode,
        String & res)
20 21 22
    {
        return IParserBase::wrapParseImpl(pos, [&]
        {
23
            if (!id_mode)
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
                return parseRoleName(pos, expected, res);

            if (!ParserKeyword{"ID"}.ignore(pos, expected))
                return false;
            if (!ParserToken(TokenType::OpeningRoundBracket).ignore(pos, expected))
                return false;
            ASTPtr ast;
            if (!ParserStringLiteral{}.parse(pos, ast, expected))
                return false;
            String id = ast->as<ASTLiteral &>().value.safeGet<String>();
            if (!ParserToken(TokenType::ClosingRoundBracket).ignore(pos, expected))
                return false;

            res = std::move(id);
            return true;
        });
    }


    bool parseBeforeExcept(
        IParserBase::Pos & pos,
        Expected & expected,
        bool id_mode,
47
        bool allow_all,
48
        bool allow_current_user,
49 50 51
        Strings & names,
        bool & all,
        bool & current_user)
V
Vitaly Baranov 已提交
52
    {
53 54 55 56 57
        bool res_all = false;
        bool res_current_user = false;
        Strings res_names;

        auto parse_element = [&]
V
Vitaly Baranov 已提交
58
        {
59 60 61 62
            if (ParserKeyword{"NONE"}.ignore(pos, expected))
                return true;

            if (allow_all && ParserKeyword{"ALL"}.ignore(pos, expected))
V
Vitaly Baranov 已提交
63
            {
64 65
                res_all = true;
                return true;
V
Vitaly Baranov 已提交
66 67
            }

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
            if (allow_current_user && parseCurrentUserTag(pos, expected))
            {
                res_current_user = true;
                return true;
            }

            String name;
            if (parseRoleNameOrID(pos, expected, id_mode, name))
            {
                res_names.emplace_back(std::move(name));
                return true;
            }

            return false;
        };

        if (!ParserList::parseUtil(pos, expected, parse_element, false))
            return false;

        names = std::move(res_names);
        all = res_all;
        current_user = res_current_user;
        return true;
V
Vitaly Baranov 已提交
91 92
    }

93 94 95 96
    bool parseExceptAndAfterExcept(
        IParserBase::Pos & pos,
        Expected & expected,
        bool id_mode,
97
        bool allow_current_user,
98 99
        Strings & except_names,
        bool & except_current_user)
V
Vitaly Baranov 已提交
100
    {
101 102 103 104 105
        return IParserBase::wrapParseImpl(pos, [&]
        {
            if (!ParserKeyword{"EXCEPT"}.ignore(pos, expected))
                return false;

106 107
            bool unused;
            return parseBeforeExcept(pos, expected, id_mode, false, allow_current_user, except_names, unused, except_current_user);
108
        });
V
Vitaly Baranov 已提交
109
    }
110 111 112
}


113
bool ParserRolesOrUsersSet::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
114 115 116 117 118 119 120
{
    Strings names;
    bool current_user = false;
    bool all = false;
    Strings except_names;
    bool except_current_user = false;

121
    if (!parseBeforeExcept(pos, expected, id_mode, allow_all, allow_current_user, names, all, current_user))
122 123
        return false;

124
    parseExceptAndAfterExcept(pos, expected, id_mode, allow_current_user, except_names, except_current_user);
125 126 127

    if (all)
        names.clear();
V
Vitaly Baranov 已提交
128

129
    auto result = std::make_shared<ASTRolesOrUsersSet>();
130
    result->names = std::move(names);
V
Vitaly Baranov 已提交
131
    result->current_user = current_user;
132 133
    result->all = all;
    result->except_names = std::move(except_names);
V
Vitaly Baranov 已提交
134
    result->except_current_user = except_current_user;
135
    result->id_mode = id_mode;
136 137
    result->allow_user_names = allow_user_names;
    result->allow_role_names = allow_role_names;
V
Vitaly Baranov 已提交
138 139 140 141 142
    node = result;
    return true;
}

}