1 | #include <Parsers/ParserDropAccessEntityQuery.h> |
2 | #include <Parsers/ASTDropAccessEntityQuery.h> |
3 | #include <Parsers/CommonParsers.h> |
4 | #include <Parsers/parseIdentifierOrStringLiteral.h> |
5 | #include <Parsers/parseDatabaseAndTableName.h> |
6 | #include <Access/Quota.h> |
7 | |
8 | |
9 | namespace DB |
10 | { |
11 | namespace |
12 | { |
13 | bool parseNames(IParserBase::Pos & pos, Expected & expected, Strings & names) |
14 | { |
15 | do |
16 | { |
17 | String name; |
18 | if (!parseIdentifierOrStringLiteral(pos, expected, name)) |
19 | return false; |
20 | |
21 | names.push_back(std::move(name)); |
22 | } |
23 | while (ParserToken{TokenType::Comma}.ignore(pos, expected)); |
24 | return true; |
25 | } |
26 | } |
27 | |
28 | |
29 | bool ParserDropAccessEntityQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) |
30 | { |
31 | if (!ParserKeyword{"DROP" }.ignore(pos, expected)) |
32 | return false; |
33 | |
34 | using Kind = ASTDropAccessEntityQuery::Kind; |
35 | Kind kind; |
36 | if (ParserKeyword{"QUOTA" }.ignore(pos, expected)) |
37 | kind = Kind::QUOTA; |
38 | else if (ParserKeyword{"POLICY" }.ignore(pos, expected) || ParserKeyword{"ROW POLICY" }.ignore(pos, expected)) |
39 | kind = Kind::ROW_POLICY; |
40 | else |
41 | return false; |
42 | |
43 | bool if_exists = false; |
44 | if (ParserKeyword{"IF EXISTS" }.ignore(pos, expected)) |
45 | if_exists = true; |
46 | |
47 | Strings names; |
48 | std::vector<RowPolicy::FullNameParts> row_policies_names; |
49 | |
50 | if (kind == Kind::ROW_POLICY) |
51 | { |
52 | do |
53 | { |
54 | Strings policy_names; |
55 | if (!parseNames(pos, expected, policy_names)) |
56 | return false; |
57 | String database, table_name; |
58 | if (!ParserKeyword{"ON" }.ignore(pos, expected) || !parseDatabaseAndTableName(pos, expected, database, table_name)) |
59 | return false; |
60 | for (const String & policy_name : policy_names) |
61 | row_policies_names.push_back({database, table_name, policy_name}); |
62 | } |
63 | while (ParserToken{TokenType::Comma}.ignore(pos, expected)); |
64 | } |
65 | else |
66 | { |
67 | if (!parseNames(pos, expected, names)) |
68 | return false; |
69 | } |
70 | |
71 | auto query = std::make_shared<ASTDropAccessEntityQuery>(kind); |
72 | node = query; |
73 | |
74 | query->if_exists = if_exists; |
75 | query->names = std::move(names); |
76 | query->row_policies_names = std::move(row_policies_names); |
77 | |
78 | return true; |
79 | } |
80 | } |
81 | |