Add grammar for dump query
Summary: Defined Antlr4 grammar for `DUMP DATABASE` query. Defined DUMP permission in auth module. Reviewers: teon.banek, mferencevic Reviewed By: teon.banek, mferencevic Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D2077
This commit is contained in:
parent
d6de4f4295
commit
1bcb3cbd86
@ -36,12 +36,14 @@ std::string PermissionToString(Permission permission) {
|
||||
return "INDEX";
|
||||
case Permission::STATS:
|
||||
return "STATS";
|
||||
case Permission::CONSTRAINT:
|
||||
return "CONSTRAINT";
|
||||
case Permission::DUMP:
|
||||
return "DUMP";
|
||||
case Permission::AUTH:
|
||||
return "AUTH";
|
||||
case Permission::STREAM:
|
||||
return "STREAM";
|
||||
case Permission::CONSTRAINT:
|
||||
return "CONSTRAINT";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,7 @@ enum class Permission : uint64_t {
|
||||
INDEX = 0x00000040,
|
||||
STATS = 0x00000080,
|
||||
CONSTRAINT = 0x00000100,
|
||||
DUMP = 0x00000200,
|
||||
AUTH = 0x00010000,
|
||||
STREAM = 0x00020000,
|
||||
};
|
||||
@ -27,8 +28,8 @@ enum class Permission : uint64_t {
|
||||
const std::vector<Permission> kPermissionsAll = {
|
||||
Permission::MATCH, Permission::CREATE, Permission::MERGE,
|
||||
Permission::DELETE, Permission::SET, Permission::REMOVE,
|
||||
Permission::INDEX, Permission::STATS, Permission::AUTH,
|
||||
Permission::STREAM};
|
||||
Permission::INDEX, Permission::STATS, Permission::CONSTRAINT,
|
||||
Permission::DUMP, Permission::AUTH, Permission::STREAM};
|
||||
|
||||
// Function that converts a permission to its string representation.
|
||||
std::string PermissionToString(Permission permission);
|
||||
|
@ -20,13 +20,14 @@ auth::Permission PrivilegeToPermission(query::AuthQuery::Privilege privilege) {
|
||||
return auth::Permission::INDEX;
|
||||
case query::AuthQuery::Privilege::STATS:
|
||||
return auth::Permission::STATS;
|
||||
case query::AuthQuery::Privilege::CONSTRAINT:
|
||||
return auth::Permission::CONSTRAINT;
|
||||
case query::AuthQuery::Privilege::DUMP:
|
||||
return auth::Permission::DUMP;
|
||||
case query::AuthQuery::Privilege::AUTH:
|
||||
return auth::Permission::AUTH;
|
||||
case query::AuthQuery::Privilege::STREAM:
|
||||
return auth::Permission::STREAM;
|
||||
case query::AuthQuery::Privilege::CONSTRAINT:
|
||||
return auth::Permission::CONSTRAINT;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2064,7 +2064,8 @@ cpp<#
|
||||
show-users-for-role)
|
||||
(:serialize))
|
||||
(lcp:define-enum privilege
|
||||
(create delete match merge set remove index stats auth stream constraint)
|
||||
(create delete match merge set remove index stats auth stream constraint
|
||||
dump)
|
||||
(:serialize))
|
||||
#>cpp
|
||||
AuthQuery() = default;
|
||||
@ -2094,12 +2095,12 @@ cpp<#
|
||||
#>cpp
|
||||
/// Constant that holds all available privileges.
|
||||
const std::vector<AuthQuery::Privilege> kPrivilegesAll = {
|
||||
AuthQuery::Privilege::CREATE, AuthQuery::Privilege::DELETE,
|
||||
AuthQuery::Privilege::MATCH, AuthQuery::Privilege::MERGE,
|
||||
AuthQuery::Privilege::SET, AuthQuery::Privilege::REMOVE,
|
||||
AuthQuery::Privilege::INDEX, AuthQuery::Privilege::STATS,
|
||||
AuthQuery::Privilege::AUTH, AuthQuery::Privilege::STREAM,
|
||||
AuthQuery::Privilege::CONSTRAINT};
|
||||
AuthQuery::Privilege::CREATE, AuthQuery::Privilege::DELETE,
|
||||
AuthQuery::Privilege::MATCH, AuthQuery::Privilege::MERGE,
|
||||
AuthQuery::Privilege::SET, AuthQuery::Privilege::REMOVE,
|
||||
AuthQuery::Privilege::INDEX, AuthQuery::Privilege::STATS,
|
||||
AuthQuery::Privilege::AUTH, AuthQuery::Privilege::STREAM,
|
||||
AuthQuery::Privilege::CONSTRAINT, AuthQuery::Privilege::DUMP};
|
||||
cpp<#
|
||||
|
||||
(lcp:define-class stream-query (query)
|
||||
@ -2215,4 +2216,12 @@ cpp<#
|
||||
(:serialize (:slk))
|
||||
(:clone))
|
||||
|
||||
(lcp:define-class dump-query (query) ()
|
||||
(:public
|
||||
#>cpp
|
||||
DEFVISITABLE(QueryVisitor<void>);
|
||||
cpp<#)
|
||||
(:serialize (:slk))
|
||||
(:clone))
|
||||
|
||||
(lcp:pop-namespace) ;; namespace query
|
||||
|
@ -69,6 +69,7 @@ class StreamQuery;
|
||||
class InfoQuery;
|
||||
class ConstraintQuery;
|
||||
class RegexMatch;
|
||||
class DumpQuery;
|
||||
|
||||
using TreeCompositeVisitor = ::utils::CompositeVisitor<
|
||||
SingleQuery, CypherUnion, NamedExpression, OrOperator, XorOperator,
|
||||
@ -113,6 +114,6 @@ template <class TResult>
|
||||
class QueryVisitor
|
||||
: public ::utils::Visitor<TResult, CypherQuery, ExplainQuery, ProfileQuery,
|
||||
IndexQuery, AuthQuery, StreamQuery, InfoQuery,
|
||||
ConstraintQuery> {};
|
||||
ConstraintQuery, DumpQuery> {};
|
||||
|
||||
} // namespace query
|
||||
|
@ -187,6 +187,13 @@ antlrcpp::Any CypherMainVisitor::visitStreamQuery(
|
||||
return stream_query;
|
||||
}
|
||||
|
||||
antlrcpp::Any CypherMainVisitor::visitDumpQuery(
|
||||
MemgraphCypher::DumpQueryContext *ctx) {
|
||||
auto *dump_query = storage_->Create<DumpQuery>();
|
||||
query_ = dump_query;
|
||||
return dump_query;
|
||||
}
|
||||
|
||||
antlrcpp::Any CypherMainVisitor::visitCypherUnion(
|
||||
MemgraphCypher::CypherUnionContext *ctx) {
|
||||
bool distinct = !ctx->ALL();
|
||||
|
@ -187,6 +187,11 @@ class CypherMainVisitor : public antlropencypher::MemgraphCypherBaseVisitor {
|
||||
antlrcpp::Any visitStreamQuery(
|
||||
MemgraphCypher::StreamQueryContext *ctx) override;
|
||||
|
||||
/**
|
||||
* @return DumpQuery*
|
||||
*/
|
||||
antlrcpp::Any visitDumpQuery(MemgraphCypher::DumpQueryContext *ctx) override;
|
||||
|
||||
/**
|
||||
* @return CypherUnion*
|
||||
*/
|
||||
|
@ -13,8 +13,10 @@ memgraphCypherKeyword : cypherKeyword
|
||||
| BATCHES
|
||||
| CLEAR
|
||||
| DATA
|
||||
| DATABASE
|
||||
| DENY
|
||||
| DROP
|
||||
| DUMP
|
||||
| FOR
|
||||
| FROM
|
||||
| GRANT
|
||||
@ -54,6 +56,7 @@ query : cypherQuery
|
||||
| constraintQuery
|
||||
| authQuery
|
||||
| streamQuery
|
||||
| dumpQuery
|
||||
;
|
||||
|
||||
authQuery : createRole
|
||||
@ -101,7 +104,7 @@ denyPrivilege : DENY ( ALL PRIVILEGES | privileges=privilegeList ) TO userOrRole
|
||||
revokePrivilege : REVOKE ( ALL PRIVILEGES | privileges=privilegeList ) FROM userOrRole=userOrRoleName ;
|
||||
|
||||
privilege : CREATE | DELETE | MATCH | MERGE | SET
|
||||
| REMOVE | INDEX | STATS | AUTH | STREAM | CONSTRAINT ;
|
||||
| REMOVE | INDEX | STATS | AUTH | STREAM | CONSTRAINT | DUMP ;
|
||||
|
||||
privilegeList : privilege ( ',' privilege )* ;
|
||||
|
||||
@ -146,3 +149,5 @@ startAllStreams : START ALL STREAMS ;
|
||||
stopAllStreams : STOP ALL STREAMS ;
|
||||
|
||||
testStream : K_TEST STREAM streamName ( limitBatchesOption )? ;
|
||||
|
||||
dumpQuery: DUMP DATABASE ;
|
||||
|
@ -16,8 +16,10 @@ BATCH : B A T C H ;
|
||||
BATCHES : B A T C H E S ;
|
||||
CLEAR : C L E A R ;
|
||||
DATA : D A T A ;
|
||||
DATABASE : D A T A B A S E ;
|
||||
DENY : D E N Y ;
|
||||
DROP : D R O P ;
|
||||
DUMP : D U M P ;
|
||||
FOR : F O R ;
|
||||
FROM : F R O M ;
|
||||
GRANT : G R A N T ;
|
||||
|
@ -64,6 +64,10 @@ class PrivilegeExtractor : public QueryVisitor<void>,
|
||||
}
|
||||
}
|
||||
|
||||
void Visit(DumpQuery &dump_query) override {
|
||||
AddPrivilege(AuthQuery::Privilege::DUMP);
|
||||
}
|
||||
|
||||
bool PreVisit(Create &) override {
|
||||
AddPrivilege(AuthQuery::Privilege::CREATE);
|
||||
return false;
|
||||
|
@ -92,7 +92,7 @@ const trie::Trie kKeywords = {
|
||||
"batch", "interval", "show", "start", "stats", "stop",
|
||||
"size", "topic", "test", "unique", "explain", "profile",
|
||||
"storage", "index", "info", "exists", "assert", "constraint",
|
||||
"node", "key"};
|
||||
"node", "key", "dump", "database"};
|
||||
|
||||
// Unicode codepoints that are allowed at the start of the unescaped name.
|
||||
const std::bitset<kBitsetSize> kUnescapedNameAllowedStarts(std::string(
|
||||
|
@ -726,6 +726,10 @@ Callback HandleConstraintQuery(ConstraintQuery *constraint_query,
|
||||
#endif
|
||||
}
|
||||
|
||||
Callback HandleDumpQuery(database::GraphDbAccessor *db_accessor) {
|
||||
throw utils::NotYetImplemented("Dump database");
|
||||
}
|
||||
|
||||
Interpreter::Interpreter() : is_tsc_available_(utils::CheckAvailableTSC()) {}
|
||||
|
||||
Interpreter::Results Interpreter::operator()(
|
||||
@ -988,6 +992,9 @@ Interpreter::Results Interpreter::operator()(
|
||||
} else if (auto *constraint_query =
|
||||
utils::Downcast<ConstraintQuery>(parsed_query.query)) {
|
||||
callback = HandleConstraintQuery(constraint_query, &db_accessor);
|
||||
} else if (auto *dump_query =
|
||||
utils::Downcast<DumpQuery>(parsed_query.query)) {
|
||||
callback = HandleDumpQuery(&db_accessor);
|
||||
} else {
|
||||
LOG(FATAL) << "Should not get here -- unknown query type!";
|
||||
}
|
||||
|
@ -2911,4 +2911,12 @@ TEST_P(CypherMainVisitorTest, RegexMatch) {
|
||||
}
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(hicpp-special-member-functions)
|
||||
TEST_P(CypherMainVisitorTest, DumpDatabase) {
|
||||
auto &ast_generator = *GetParam();
|
||||
auto *query =
|
||||
dynamic_cast<DumpQuery *>(ast_generator.ParseQuery("DUMP DATABASE"));
|
||||
ASSERT_TRUE(query);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
@ -173,3 +173,10 @@ TEST_F(TestPrivilegeExtractor, DropConstraint) {
|
||||
EXPECT_THAT(GetRequiredPrivileges(query),
|
||||
UnorderedElementsAre(AuthQuery::Privilege::CONSTRAINT));
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(hicpp-special-member-functions)
|
||||
TEST_F(TestPrivilegeExtractor, DumpDatabase) {
|
||||
auto *query = storage.Create<DumpQuery>();
|
||||
EXPECT_THAT(GetRequiredPrivileges(query),
|
||||
UnorderedElementsAre(AuthQuery::Privilege::DUMP));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user