Skip to content

Commit

Permalink
Merge pull request #1911 from kuzudb/merge-mark-fix
Browse files Browse the repository at this point in the history
Fix merge operator mark
  • Loading branch information
ray6080 committed Aug 9, 2023
2 parents 95d3ba3 + 44a70ab commit 8f9cf3f
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 6 deletions.
3 changes: 3 additions & 0 deletions src/binder/bind/bind_updating_clause.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ std::vector<std::unique_ptr<BoundCreateInfo>> Binder::bindCreateInfos(
result.push_back(bindCreateRelInfo(rel, keyValCollection));
}
}
if (result.empty()) {
throw BinderException("Cannot resolve any node or relationship to create.");
}
return result;
}

Expand Down
22 changes: 16 additions & 6 deletions src/planner/plan/plan_update.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,27 @@ void QueryPlanner::planCreateClause(

void QueryPlanner::planMergeClause(binder::BoundUpdatingClause& updatingClause, LogicalPlan& plan) {
auto& mergeClause = (BoundMergeClause&)updatingClause;
auto queryGraphCollection = mergeClause.getQueryGraphCollection();
binder::expression_vector predicates;
if (mergeClause.hasPredicate()) {
predicates = mergeClause.getPredicate()->splitOnAND();
}
planOptionalMatch(*mergeClause.getQueryGraphCollection(), predicates, plan);
// TODO(Xiyang): fix mark
auto rels = queryGraphCollection->getQueryRels();
auto nodes = queryGraphCollection->getQueryNodes();
auto mark =
!rels.empty() ? rels[0]->getInternalIDProperty() : nodes[0]->getInternalIDProperty();
std::shared_ptr<Expression> mark;
auto& createInfos = mergeClause.getCreateInfosRef();
assert(!createInfos.empty());
auto createInfo = createInfos[0].get();
switch (createInfo->updateTableType) {
case binder::UpdateTableType::NODE: {
auto node = (NodeExpression*)createInfo->nodeOrRel.get();
mark = node->getInternalIDProperty();
} break;
case binder::UpdateTableType::REL: {
auto rel = (RelExpression*)createInfo->nodeOrRel.get();
mark = rel->getInternalIDProperty();
} break;
default:
throw common::NotImplementedException("QueryPlanner::planMergeClause");
}
std::vector<std::unique_ptr<LogicalCreateNodeInfo>> logicalCreateNodeInfos;
std::vector<std::unique_ptr<LogicalSetPropertyInfo>> logicalCreateNodeSetInfos;
if (mergeClause.hasCreateNodeInfo()) {
Expand Down
10 changes: 10 additions & 0 deletions test/test_files/exceptions/binder/binder_error.test
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@

-CASE BinderError

-LOG EmptyCreateClause
-STATEMENT MATCH (a:person) CREATE (a);
---- error
Binder exception: Cannot resolve any node or relationship to create.

-LOG EmptyMergeClause
-STATEMENT MATCH (a:person) MERGE (a);
---- error
Binder exception: Cannot resolve any node or relationship to create.

-LOG NodeTableNotExist
-STATEMENT MATCH (a:PERSON) RETURN COUNT(*)
---- error
Expand Down

0 comments on commit 8f9cf3f

Please sign in to comment.