From bfd8921777015ece5f4d79f59112b2b63d1dcc9e Mon Sep 17 00:00:00 2001 From: Josip Mrden <josip.mrden@memgraph.io> Date: Tue, 12 Mar 2024 12:37:43 +0100 Subject: [PATCH] Forbid merge with null properties --- .../frontend/semantic/symbol_generator.cpp | 8 ++++++++ .../frontend/semantic/symbol_generator.hpp | 2 +- .../tests/memgraph_V1/features/merge.feature | 19 +++++++++++++++++-- .../features/merge.feature | 16 ++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/query/frontend/semantic/symbol_generator.cpp b/src/query/frontend/semantic/symbol_generator.cpp index 2cfbee584..bf343e958 100644 --- a/src/query/frontend/semantic/symbol_generator.cpp +++ b/src/query/frontend/semantic/symbol_generator.cpp @@ -745,6 +745,14 @@ bool SymbolGenerator::PreVisit(PatternComprehension &pc) { return true; } +bool SymbolGenerator::Visit(PrimitiveLiteral &primitive_literal) { + auto &scope = scopes_.back(); + if (scope.in_merge && primitive_literal.value_.IsNull()) { + throw SemanticException("Cannot merge node or relationship entity because of null property value!"); + } + return true; +} + bool SymbolGenerator::PostVisit(PatternComprehension & /*pc*/) { return true; } void SymbolGenerator::VisitWithIdentifiers(Expression *expr, const std::vector<Identifier *> &identifiers) { diff --git a/src/query/frontend/semantic/symbol_generator.hpp b/src/query/frontend/semantic/symbol_generator.hpp index e5b46fbfe..80b92be64 100644 --- a/src/query/frontend/semantic/symbol_generator.hpp +++ b/src/query/frontend/semantic/symbol_generator.hpp @@ -71,7 +71,7 @@ class SymbolGenerator : public HierarchicalTreeVisitor { // Expressions ReturnType Visit(Identifier &) override; - ReturnType Visit(PrimitiveLiteral &) override { return true; } + ReturnType Visit(PrimitiveLiteral &) override; bool PreVisit(MapLiteral &) override; bool PostVisit(MapLiteral &) override { return true; }; ReturnType Visit(ParameterLookup &) override { return true; } diff --git a/tests/gql_behave/tests/memgraph_V1/features/merge.feature b/tests/gql_behave/tests/memgraph_V1/features/merge.feature index 5db5efd08..8cb28b6c6 100644 --- a/tests/gql_behave/tests/memgraph_V1/features/merge.feature +++ b/tests/gql_behave/tests/memgraph_V1/features/merge.feature @@ -187,7 +187,7 @@ Feature: Merge feature Then the result should be: | r | | [:X] | - + Scenario: Merge relationship test02 Given an empty graph And having executed: @@ -417,4 +417,19 @@ Feature: Merge feature | ({a: 1}) | | ({a: 2}) | | ({a: 3)) | - + + Scenario: Merge node with null property error + Given an empty graph + When executing query: + """ + MERGE ({id: null}) + """ + Then an error should be raised + + Scenario: Merge edge with null property error + Given an empty graph + When executing query: + """ + MERGE ()-[:TYPE {id:null}]->() + """ + Then an error should be raised diff --git a/tests/gql_behave/tests/memgraph_V1_on_disk/features/merge.feature b/tests/gql_behave/tests/memgraph_V1_on_disk/features/merge.feature index 448f31d18..8cb28b6c6 100644 --- a/tests/gql_behave/tests/memgraph_V1_on_disk/features/merge.feature +++ b/tests/gql_behave/tests/memgraph_V1_on_disk/features/merge.feature @@ -417,3 +417,19 @@ Feature: Merge feature | ({a: 1}) | | ({a: 2}) | | ({a: 3)) | + + Scenario: Merge node with null property error + Given an empty graph + When executing query: + """ + MERGE ({id: null}) + """ + Then an error should be raised + + Scenario: Merge edge with null property error + Given an empty graph + When executing query: + """ + MERGE ()-[:TYPE {id:null}]->() + """ + Then an error should be raised