diff --git a/src/query/frontend/ast/cypher_main_visitor.cpp b/src/query/frontend/ast/cypher_main_visitor.cpp index 2066c7244..eb7e113c4 100644 --- a/src/query/frontend/ast/cypher_main_visitor.cpp +++ b/src/query/frontend/ast/cypher_main_visitor.cpp @@ -1109,6 +1109,9 @@ antlrcpp::Any CypherMainVisitor::visitAtom(MemgraphCypher::AtomContext *ctx) { .as()); Expression *list_expr = ctx->filterExpression()->idInColl()->expression()->accept(this); + if (!ctx->filterExpression()->where()) { + throw SyntaxException("all(...) requires a WHERE predicate"); + } Where *where = ctx->filterExpression()->where()->accept(this); return static_cast( storage_.Create(ident, list_expr, where)); @@ -1120,6 +1123,9 @@ antlrcpp::Any CypherMainVisitor::visitAtom(MemgraphCypher::AtomContext *ctx) { .as()); Expression *list_expr = ctx->filterExpression()->idInColl()->expression()->accept(this); + if (!ctx->filterExpression()->where()) { + throw SyntaxException("single(...) requires a WHERE predicate"); + } Where *where = ctx->filterExpression()->where()->accept(this); return static_cast( storage_.Create(ident, list_expr, where)); diff --git a/tests/unit/cypher_main_visitor.cpp b/tests/unit/cypher_main_visitor.cpp index 7c44061c9..269e17acf 100644 --- a/tests/unit/cypher_main_visitor.cpp +++ b/tests/unit/cypher_main_visitor.cpp @@ -1565,24 +1565,29 @@ TYPED_TEST(CypherMainVisitorTest, CreateIndex) { } TYPED_TEST(CypherMainVisitorTest, ReturnAll) { - TypeParam ast_generator("RETURN all(x IN [1,2,3] WHERE x = 2)"); - auto *query = ast_generator.query_; - ASSERT_TRUE(query->single_query_); - auto *single_query = query->single_query_; - ASSERT_EQ(single_query->clauses_.size(), 1U); - auto *ret = dynamic_cast(single_query->clauses_[0]); - ASSERT_TRUE(ret); - ASSERT_EQ(ret->body_.named_expressions.size(), 1U); - auto *all = dynamic_cast(ret->body_.named_expressions[0]->expression_); - ASSERT_TRUE(all); - EXPECT_EQ(all->identifier_->name_, "x"); - auto *list_literal = dynamic_cast(all->list_expression_); - EXPECT_TRUE(list_literal); - auto *eq = dynamic_cast(all->where_->expression_); - EXPECT_TRUE(eq); + { EXPECT_THROW(TypeParam("RETURN all(x in [1,2,3])"), SyntaxException); } + { + TypeParam ast_generator("RETURN all(x IN [1,2,3] WHERE x = 2)"); + auto *query = ast_generator.query_; + ASSERT_TRUE(query->single_query_); + auto *single_query = query->single_query_; + ASSERT_EQ(single_query->clauses_.size(), 1U); + auto *ret = dynamic_cast(single_query->clauses_[0]); + ASSERT_TRUE(ret); + ASSERT_EQ(ret->body_.named_expressions.size(), 1U); + auto *all = + dynamic_cast(ret->body_.named_expressions[0]->expression_); + ASSERT_TRUE(all); + EXPECT_EQ(all->identifier_->name_, "x"); + auto *list_literal = dynamic_cast(all->list_expression_); + EXPECT_TRUE(list_literal); + auto *eq = dynamic_cast(all->where_->expression_); + EXPECT_TRUE(eq); + } } TYPED_TEST(CypherMainVisitorTest, ReturnSingle) { + { EXPECT_THROW(TypeParam("RETURN single(x in [1,2,3])"), SyntaxException); } TypeParam ast_generator("RETURN single(x IN [1,2,3] WHERE x = 2)"); auto *query = ast_generator.query_; ASSERT_TRUE(query->single_query_);