From 7a58ec5afbd39d489e110236d8adadc13bd85500 Mon Sep 17 00:00:00 2001 From: Mislav Bradac Date: Fri, 7 Apr 2017 18:32:40 +0200 Subject: [PATCH] Fix bug in parenthesized expression Reviewers: buda Reviewed By: buda Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D249 --- .../frontend/ast/cypher_main_visitor.cpp | 14 ++++++++---- .../frontend/ast/cypher_main_visitor.hpp | 22 ++++++++++++------- tests/unit/cypher_main_visitor.cpp | 10 +++++++++ 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/query/frontend/ast/cypher_main_visitor.cpp b/src/query/frontend/ast/cypher_main_visitor.cpp index fe8351c5a..a900a1b73 100644 --- a/src/query/frontend/ast/cypher_main_visitor.cpp +++ b/src/query/frontend/ast/cypher_main_visitor.cpp @@ -360,7 +360,7 @@ antlrcpp::Any CypherMainVisitor::visitRangeLiteral( antlrcpp::Any CypherMainVisitor::visitExpression( CypherParser::ExpressionContext *ctx) { - return visitChildren(ctx); + return static_cast(ctx->expression12()->accept(this)); } // OR. @@ -499,7 +499,7 @@ antlrcpp::Any CypherMainVisitor::visitExpression3( if (ctx->children.size() > 1u) { throw NotYetImplemented(); } - return visitChildren(ctx); + return static_cast(visitChildren(ctx)); } antlrcpp::Any CypherMainVisitor::visitExpression2( @@ -525,11 +525,12 @@ antlrcpp::Any CypherMainVisitor::visitAtom(CypherParser::AtomContext *ctx) { // TODO: implement other clauses. throw NotYetImplemented(); } else if (ctx->parenthesizedExpression()) { - return ctx->parenthesizedExpression()->accept(this); + return static_cast( + ctx->parenthesizedExpression()->accept(this)); } else if (ctx->variable()) { std::string variable = ctx->variable()->accept(this); users_identifiers.insert(variable); - return (Expression *)storage_.Create(variable); + return static_cast(storage_.Create(variable)); } // TODO: Implement this. We don't support comprehensions, functions, // filtering... at the moment. @@ -556,6 +557,11 @@ antlrcpp::Any CypherMainVisitor::visitLiteral( return visitChildren(ctx); } +antlrcpp::Any CypherMainVisitor::visitParenthesizedExpression( + CypherParser::ParenthesizedExpressionContext *ctx) { + return static_cast(ctx->expression()->accept(this)); +} + antlrcpp::Any CypherMainVisitor::visitNumberLiteral( CypherParser::NumberLiteralContext *ctx) { if (ctx->integerLiteral()) { diff --git a/src/query/frontend/ast/cypher_main_visitor.hpp b/src/query/frontend/ast/cypher_main_visitor.hpp index 07cdba5c8..cb9028fbf 100644 --- a/src/query/frontend/ast/cypher_main_visitor.hpp +++ b/src/query/frontend/ast/cypher_main_visitor.hpp @@ -350,20 +350,26 @@ class CypherMainVisitor : public antlropencypher::CypherBaseVisitor { CypherParser::Expression3Context *ctx) override; /** - * Property lookup, test for node labels existence... - * - * @return Expression* - */ + * Property lookup, test for node labels existence... + * + * @return Expression* + */ antlrcpp::Any visitExpression2( CypherParser::Expression2Context *ctx) override; /** - * Literals, params, list comprehension... - * - * @return Expression* - */ + * Literals, params, list comprehension... + * + * @return Expression* + */ antlrcpp::Any visitAtom(CypherParser::AtomContext *ctx) override; + /** + * @return Expression* + */ + antlrcpp::Any visitParenthesizedExpression( + CypherParser::ParenthesizedExpressionContext *ctx) override; + /** * @return Literal* */ diff --git a/tests/unit/cypher_main_visitor.cpp b/tests/unit/cypher_main_visitor.cpp index 6ad2b95f2..701907f74 100644 --- a/tests/unit/cypher_main_visitor.cpp +++ b/tests/unit/cypher_main_visitor.cpp @@ -121,6 +121,16 @@ TEST(CypherMainVisitorTest, NullLiteral) { ASSERT_EQ(literal->value_.type(), TypedValue::Type::Null); } +TEST(CypherMainVisitorTest, ParenthesizedExpression) { + AstGenerator ast_generator("RETURN (2)"); + auto *query = ast_generator.query_; + auto *return_clause = dynamic_cast(query->clauses_[0]); + auto *literal = dynamic_cast( + return_clause->named_expressions_[0]->expression_); + ASSERT_TRUE(literal); + ASSERT_EQ(literal->value_.Value(), 2); +} + TEST(CypherMainVisitorTest, OrOperator) { AstGenerator ast_generator("RETURN true Or false oR n"); auto *query = ast_generator.query_;