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:
parent
6ed297e1d9
commit
6cb1cdc607
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user