Convert escaped labels to AST
Reviewers: buda Reviewed By: buda Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D352
This commit is contained in:
parent
b76685cba7
commit
5ae55499bc
@ -291,13 +291,32 @@ antlrcpp::Any CypherMainVisitor::visitPropertyKeyName(
|
|||||||
antlrcpp::Any CypherMainVisitor::visitSymbolicName(
|
antlrcpp::Any CypherMainVisitor::visitSymbolicName(
|
||||||
CypherParser::SymbolicNameContext *ctx) {
|
CypherParser::SymbolicNameContext *ctx) {
|
||||||
if (ctx->EscapedSymbolicName()) {
|
if (ctx->EscapedSymbolicName()) {
|
||||||
// We don't allow at this point for variable to be EscapedSymbolicName
|
auto quoted_name = ctx->getText();
|
||||||
// because we would have t ofigure out how escaping works since same
|
debug_assert(quoted_name.size() >= 2U && quoted_name[0] == '`' &&
|
||||||
// variable can be referenced in two ways: escaped and unescaped.
|
quoted_name.back() == '`',
|
||||||
// TODO: implement other clauses.
|
"Can't happen. Grammar ensures this");
|
||||||
throw utils::NotYetImplemented();
|
// Remove enclosing backticks.
|
||||||
|
std::string escaped_name =
|
||||||
|
quoted_name.substr(1, static_cast<int>(quoted_name.size()) - 2);
|
||||||
|
// Unescape remaining backticks.
|
||||||
|
std::string name;
|
||||||
|
bool escaped = false;
|
||||||
|
for (auto c : escaped_name) {
|
||||||
|
if (escaped) {
|
||||||
|
if (c == '`') {
|
||||||
|
name.push_back('`');
|
||||||
|
escaped = false;
|
||||||
|
} else {
|
||||||
|
debug_assert(false, "Can't happen. Grammar ensures that.");
|
||||||
|
}
|
||||||
|
} else if (c == '`') {
|
||||||
|
escaped = true;
|
||||||
|
} else {
|
||||||
|
name.push_back(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
// TODO: We should probably escape string.
|
|
||||||
return std::string(ctx->getText());
|
return std::string(ctx->getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +85,19 @@ TEST(CypherMainVisitorTest, LabelsTest) {
|
|||||||
ast_generator.db_accessor_->label("y")));
|
ast_generator.db_accessor_->label("y")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(CypherMainVisitorTest, EscapedLabel) {
|
||||||
|
AstGenerator ast_generator("RETURN n:`l-$\"'ab``e````l`");
|
||||||
|
auto *query = ast_generator.query_;
|
||||||
|
ASSERT_EQ(query->clauses_.size(), 1U);
|
||||||
|
auto *return_clause = dynamic_cast<Return *>(query->clauses_[0]);
|
||||||
|
auto *labels_test = dynamic_cast<LabelsTest *>(
|
||||||
|
return_clause->body_.named_expressions[0]->expression_);
|
||||||
|
auto identifier = dynamic_cast<Identifier *>(labels_test->expression_);
|
||||||
|
ASSERT_EQ(identifier->name_, "n");
|
||||||
|
ASSERT_THAT(labels_test->labels_,
|
||||||
|
ElementsAre(ast_generator.db_accessor_->label("l-$\"'ab`e``l")));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) {
|
TEST(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) {
|
||||||
AstGenerator ast_generator("RETURN x");
|
AstGenerator ast_generator("RETURN x");
|
||||||
auto *query = ast_generator.query_;
|
auto *query = ast_generator.query_;
|
||||||
|
Loading…
Reference in New Issue
Block a user