Skip to content

Commit 18a95a8

Browse files
authored
Avoid duplicate columns in return (#5443)
* fix duplicate columns * add tck.
1 parent bb4ee8c commit 18a95a8

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/graph/validator/MatchValidator.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ Status MatchValidator::buildColumnsForAllNamedAliases(const std::vector<QueryPar
386386
auto *expr = LabelExpression::make(pool, name);
387387
return new YieldColumn(expr, name);
388388
};
389+
std::set<std::string> visitedAliases;
389390
auto &currQueryPart = queryParts.back();
390391
if (queryParts.size() > 1) {
391392
auto &prevQueryPart = *(queryParts.end() - 2);
@@ -396,9 +397,11 @@ Status MatchValidator::buildColumnsForAllNamedAliases(const std::vector<QueryPar
396397
columns->addColumn(makeColumn(unwindCtx->alias), true);
397398
for (auto &passAlias : prevQueryPart.aliasesAvailable) {
398399
columns->addColumn(makeColumn(passAlias.first), true);
400+
visitedAliases.emplace(passAlias.first);
399401
}
400402
for (auto &passAlias : prevQueryPart.aliasesGenerated) {
401403
columns->addColumn(makeColumn(passAlias.first), true);
404+
visitedAliases.emplace(passAlias.first);
402405
}
403406
break;
404407
}
@@ -411,6 +414,7 @@ Status MatchValidator::buildColumnsForAllNamedAliases(const std::vector<QueryPar
411414
for (auto &col : yieldColumns->columns()) {
412415
if (!col->alias().empty()) {
413416
columns->addColumn(makeColumn(col->alias()), true);
417+
visitedAliases.emplace(col->alias());
414418
}
415419
}
416420
break;
@@ -421,7 +425,6 @@ Status MatchValidator::buildColumnsForAllNamedAliases(const std::vector<QueryPar
421425
}
422426
}
423427

424-
std::set<std::string> visitedAliases;
425428
for (auto &match : currQueryPart.matchs) {
426429
for (auto &path : match->paths) {
427430
for (size_t i = 0; i < path.edgeInfos.size(); ++i) {

tests/tck/features/match/With.feature

+47
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,50 @@ Feature: With clause
474474
with [1,2] as a unwind a as b match (b)-[e:like]->(a:player{age:30}) return b
475475
"""
476476
Then a ExecutionError should be raised at runtime: Argument only support vertex, but got 1, which is type int
477+
478+
Scenario: duplicate columns
479+
When executing query:
480+
"""
481+
match (v:player{name:"Tim Duncan"})-[e:like]-(v2)
482+
with v2, sum(e.likeness) as likeness
483+
match (v2)-[:serve]-(v3)
484+
return *
485+
"""
486+
Then the result should be, in any order:
487+
| v2 | likeness | v3 |
488+
| ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | 190 | ("Hornets" :team{}) |
489+
| ("Tony Parker" :player{age: 36, name: "Tony Parker"}) | 190 | ("Spurs" :team{}) |
490+
| ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | 80 | ("Celtics" :team{}) |
491+
| ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | 80 | ("Pistons" :team{}) |
492+
| ("Aron Baynes" :player{age: 32, name: "Aron Baynes"}) | 80 | ("Spurs" :team{}) |
493+
| ("Manu Ginobili" :player{age: 41, name: "Manu Ginobili"}) | 185 | ("Spurs" :team{}) |
494+
| ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | 80 | ("Hawks" :team{}) |
495+
| ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | 80 | ("Hornets" :team{}) |
496+
| ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | 80 | ("Jazz" :team{}) |
497+
| ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | 80 | ("Spurs" :team{}) |
498+
| ("Boris Diaw" :player{age: 36, name: "Boris Diaw"}) | 80 | ("Suns" :team{}) |
499+
| ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | 75 | ("Spurs" :team{}) |
500+
| ("LaMarcus Aldridge" :player{age: 33, name: "LaMarcus Aldridge"}) | 75 | ("Trail Blazers" :team{}) |
501+
| ("Danny Green" :player{age: 31, name: "Danny Green"}) | 70 | ("Cavaliers" :team{}) |
502+
| ("Danny Green" :player{age: 31, name: "Danny Green"}) | 70 | ("Raptors" :team{}) |
503+
| ("Danny Green" :player{age: 31, name: "Danny Green"}) | 70 | ("Spurs" :team{}) |
504+
| ("Dejounte Murray" :player{age: 29, name: "Dejounte Murray"}) | 99 | ("Spurs" :team{}) |
505+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("76ers" :team{}) |
506+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Bulls" :team{}) |
507+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Hawks" :team{}) |
508+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Hornets" :team{}) |
509+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Kings" :team{}) |
510+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Raptors" :team{}) |
511+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Spurs" :team{}) |
512+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Warriors" :team{}) |
513+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Hornets" :team{}) |
514+
| ("Marco Belinelli" :player{age: 32, name: "Marco Belinelli"}) | 55 | ("Spurs" :team{}) |
515+
| ("Shaquille O'Neal" :player{age: 47, name: "Shaquille O'Neal"}) | 80 | ("Cavaliers" :team{}) |
516+
| ("Shaquille O'Neal" :player{age: 47, name: "Shaquille O'Neal"}) | 80 | ("Celtics" :team{}) |
517+
| ("Shaquille O'Neal" :player{age: 47, name: "Shaquille O'Neal"}) | 80 | ("Heat" :team{}) |
518+
| ("Shaquille O'Neal" :player{age: 47, name: "Shaquille O'Neal"}) | 80 | ("Lakers" :team{}) |
519+
| ("Shaquille O'Neal" :player{age: 47, name: "Shaquille O'Neal"}) | 80 | ("Magic" :team{}) |
520+
| ("Shaquille O'Neal" :player{age: 47, name: "Shaquille O'Neal"}) | 80 | ("Suns" :team{}) |
521+
| ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | 80 | ("76ers" :team{}) |
522+
| ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | 80 | ("Hawks" :team{}) |
523+
| ("Tiago Splitter" :player{age: 34, name: "Tiago Splitter"}) | 80 | ("Spurs" :team{}) |

0 commit comments

Comments
 (0)