Multiple isolation levels (#171)

This PR introduces READ COMMITTED and READ UNCOMMITTED isolation levels.
The isolation level can be set with a config or with a query for different scopes.
This commit is contained in:
antonio2368
2021-06-14 15:47:57 +02:00
committed by GitHub
parent 90a093bd95
commit 8cd9f696cf
34 changed files with 810 additions and 96 deletions

View File

@@ -2065,6 +2065,8 @@ TEST_P(CypherMainVisitorTest, GrantPrivilege) {
{AuthQuery::Privilege::FREE_MEMORY});
check_auth_query(&ast_generator, "GRANT TRIGGER TO user", AuthQuery::Action::GRANT_PRIVILEGE, "", "", "user", {},
{AuthQuery::Privilege::TRIGGER});
check_auth_query(&ast_generator, "GRANT CONFIG TO user", AuthQuery::Action::GRANT_PRIVILEGE, "", "", "user", {},
{AuthQuery::Privilege::CONFIG});
}
TEST_P(CypherMainVisitorTest, DenyPrivilege) {
@@ -3129,20 +3131,20 @@ TEST_P(CypherMainVisitorTest, CreateTriggers) {
const auto *query_template = "CREATE TRIGGER trigger {} {} COMMIT EXECUTE {}";
std::array events{std::pair{"", query::TriggerQuery::EventType::ANY},
std::pair{"ON CREATE", query::TriggerQuery::EventType::CREATE},
std::pair{"ON () CREATE", query::TriggerQuery::EventType::VERTEX_CREATE},
std::pair{"ON --> CREATE", query::TriggerQuery::EventType::EDGE_CREATE},
std::pair{"ON DELETE", query::TriggerQuery::EventType::DELETE},
std::pair{"ON () DELETE", query::TriggerQuery::EventType::VERTEX_DELETE},
std::pair{"ON --> DELETE", query::TriggerQuery::EventType::EDGE_DELETE},
std::pair{"ON UPDATE", query::TriggerQuery::EventType::UPDATE},
std::pair{"ON () UPDATE", query::TriggerQuery::EventType::VERTEX_UPDATE},
std::pair{"ON --> UPDATE", query::TriggerQuery::EventType::EDGE_UPDATE}};
constexpr std::array events{std::pair{"", query::TriggerQuery::EventType::ANY},
std::pair{"ON CREATE", query::TriggerQuery::EventType::CREATE},
std::pair{"ON () CREATE", query::TriggerQuery::EventType::VERTEX_CREATE},
std::pair{"ON --> CREATE", query::TriggerQuery::EventType::EDGE_CREATE},
std::pair{"ON DELETE", query::TriggerQuery::EventType::DELETE},
std::pair{"ON () DELETE", query::TriggerQuery::EventType::VERTEX_DELETE},
std::pair{"ON --> DELETE", query::TriggerQuery::EventType::EDGE_DELETE},
std::pair{"ON UPDATE", query::TriggerQuery::EventType::UPDATE},
std::pair{"ON () UPDATE", query::TriggerQuery::EventType::VERTEX_UPDATE},
std::pair{"ON --> UPDATE", query::TriggerQuery::EventType::EDGE_UPDATE}};
std::array phases{"BEFORE", "AFTER"};
constexpr std::array phases{"BEFORE", "AFTER"};
std::array statements{
constexpr std::array statements{
"", "SOME SUPER\nSTATEMENT", "Statement with 12312321 3 ", " Statement with 12312321 3 "
};
@@ -3157,4 +3159,43 @@ TEST_P(CypherMainVisitorTest, CreateTriggers) {
}
}
namespace {
void ValidateSetIsolationLevelQuery(Base &ast_generator, const auto &query, const auto scope,
const auto isolation_level) {
auto *parsed_query = dynamic_cast<IsolationLevelQuery *>(ast_generator.ParseQuery(query));
EXPECT_EQ(parsed_query->isolation_level_scope_, scope);
EXPECT_EQ(parsed_query->isolation_level_, isolation_level);
}
} // namespace
TEST_P(CypherMainVisitorTest, SetIsolationLevelQuery) {
auto &ast_generator = *GetParam();
TestInvalidQuery("SET ISO", ast_generator);
TestInvalidQuery("SET TRANSACTION ISOLATION", ast_generator);
TestInvalidQuery("SET TRANSACTION ISOLATION LEVEL", ast_generator);
TestInvalidQuery("SET TRANSACTION ISOLATION LEVEL READ COMMITTED", ast_generator);
TestInvalidQuery("SET NEXT TRANSACTION ISOLATION LEVEL", ast_generator);
TestInvalidQuery("SET ISOLATION LEVEL READ COMMITTED", ast_generator);
TestInvalidQuery("SET GLOBAL ISOLATION LEVEL READ COMMITTED", ast_generator);
TestInvalidQuery("SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMITTED", ast_generator);
TestInvalidQuery("SET GLOBAL TRANSACTION ISOLATION LEVEL READ_COMITTED", ast_generator);
TestInvalidQuery("SET SESSION TRANSACTION ISOLATION LEVEL READCOMITTED", ast_generator);
constexpr std::array scopes{std::pair{"GLOBAL", query::IsolationLevelQuery::IsolationLevelScope::GLOBAL},
std::pair{"SESSION", query::IsolationLevelQuery::IsolationLevelScope::SESSION},
std::pair{"NEXT", query::IsolationLevelQuery::IsolationLevelScope::NEXT}};
constexpr std::array isolation_levels{
std::pair{"READ UNCOMMITTED", query::IsolationLevelQuery::IsolationLevel::READ_UNCOMMITTED},
std::pair{"READ COMMITTED", query::IsolationLevelQuery::IsolationLevel::READ_COMMITTED},
std::pair{"SNAPSHOT ISOLATION", query::IsolationLevelQuery::IsolationLevel::SNAPSHOT_ISOLATION}};
constexpr const auto *query_template = "SET {} TRANSACTION ISOLATION LEVEL {}";
for (const auto &[scope_string, scope] : scopes) {
for (const auto &[isolation_level_string, isolation_level] : isolation_levels) {
ValidateSetIsolationLevelQuery(ast_generator, fmt::format(query_template, scope_string, isolation_level_string),
scope, isolation_level);
}
}
}
} // namespace