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:
Tonko Sabolcec 2019-05-28 11:08:49 +02:00
parent d6de4f4295
commit 1bcb3cbd86
14 changed files with 76 additions and 17 deletions

View File

@ -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";
}
}

View File

@ -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);

View File

@ -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;
}
}
}

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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*
*/

View File

@ -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 ;

View File

@ -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 ;

View File

@ -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;

View File

@ -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(

View File

@ -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!";
}

View File

@ -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

View File

@ -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));
}