Raise if setting label/property in CREATE on declared node

Reviewers: florijan, mislav.bradac

Reviewed By: mislav.bradac

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D266
This commit is contained in:
Teon Banek 2017-04-12 10:50:35 +02:00
parent 6ed297e1d9
commit 6cb1cdc607
2 changed files with 40 additions and 0 deletions
src/query/frontend/semantic
tests/unit

View File

@ -123,6 +123,14 @@ void SymbolGenerator::PostVisit(Pattern &pattern) { scope_.in_pattern = false; }
void SymbolGenerator::Visit(NodeAtom &node_atom) {
scope_.in_node_atom = true;
bool props_or_labels =
!node_atom.properties_.empty() || !node_atom.labels_.empty();
const auto &node_name = node_atom.identifier_->name_;
if (scope_.in_create && props_or_labels && HasSymbol(node_name)) {
throw SemanticException(
"Cannot create node '" + node_name +
"' with labels or properties, because it is already declared.");
}
scope_.in_property_map = true;
for (auto kv : node_atom.properties_) {
kv.second->Accept(*this);

View File

@ -376,4 +376,36 @@ TEST(TestSymbolGenerator, CreateMultiExpand) {
EXPECT_NE(r, p);
}
TEST(TestSymbolGenerator, MatchCreateExpandLabel) {
// Test MATCH (n) CREATE (m) -[r :r]-> (n:label)
Dbms dbms;
auto dba = dbms.active();
auto r_type = dba->edge_type("r");
auto label = dba->label("label");
AstTreeStorage storage;
auto query = QUERY(
MATCH(PATTERN(NODE("n"))),
CREATE(PATTERN(NODE("m"), EDGE("r", r_type, EdgeAtom::Direction::RIGHT),
NODE("n", label))));
SymbolTable symbol_table;
SymbolGenerator symbol_generator(symbol_table);
EXPECT_THROW(query->Accept(symbol_generator), SemanticException);
}
TEST(TestSymbolGenerator, CreateExpandProperty) {
// Test CREATE (n) -[r :r]-> (n {prop: 42})
Dbms dbms;
auto dba = dbms.active();
auto r_type = dba->edge_type("r");
auto prop = dba->property("prop");
AstTreeStorage storage;
auto n_prop = NODE("n");
n_prop->properties_[prop] = LITERAL(42);
auto query = QUERY(CREATE(PATTERN(
NODE("n"), EDGE("r", r_type, EdgeAtom::Direction::RIGHT), n_prop)));
SymbolTable symbol_table;
SymbolGenerator symbol_generator(symbol_table);
EXPECT_THROW(query->Accept(symbol_generator), SemanticException);
}
}