Skip to content

Commit

Permalink
Merge pull request #41413 from LakshanWeerasinghe/fix-#41392
Browse files Browse the repository at this point in the history
Fix collect clause not supported inside a query action statement
  • Loading branch information
KavinduZoysa authored Jan 23, 2024
2 parents 5bf5d9f + 445546b commit 859fff4
Show file tree
Hide file tree
Showing 13 changed files with 2,963 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,8 @@ public enum DiagnosticErrorCode implements DiagnosticCode {
ERROR_ANNOTATIONS_NOT_ALLOWED_FOR_TUPLE_REST_DESCRIPTOR("BCE0684",
"error.annotations.not.allowed.for.tuple.rest.descriptor"),
ERROR_INVALID_RE_SYNTAX_CHAR("BCE0685", "error.invalid.syntax.char"),
ERROR_MORE_CLAUSES_AFTER_COLLECT_CLAUSE("BCE0686", "error.more.clauses.after.collect.clause")
ERROR_MORE_CLAUSES_AFTER_COLLECT_CLAUSE("BCE0686", "error.more.clauses.after.collect.clause"),
ERROR_COLLECT_CLAUSE_IN_QUERY_ACTION("BCE0687", "error.collect.clause.in.query.action")
;

String diagnosticId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11949,10 +11949,11 @@ private STNode parseQueryExprRhs(STNode queryConstructType, boolean isRhsExpr, b
}
}

if (peek().kind == SyntaxKind.DO_KEYWORD && (!isNestedQueryExpr() || selectClause == null)) {
if (peek().kind == SyntaxKind.DO_KEYWORD &&
(!isNestedQueryExpr() || (selectClause == null && collectClause == null))) {
STNode intermediateClauses = STNodeFactory.createNodeList(clauses);
STNode queryPipeline = STNodeFactory.createQueryPipelineNode(fromClause, intermediateClauses);
return parseQueryAction(queryConstructType, queryPipeline, selectClause);
return parseQueryAction(queryConstructType, queryPipeline, selectClause, collectClause);
}

if (selectClause == null && collectClause == null) {
Expand Down Expand Up @@ -13553,7 +13554,8 @@ private STNode parseFieldAccessIdentifier(boolean isInConditionalExpr) {
* @param selectClause Select clause if any This is only for validation.
* @return Query action node
*/
private STNode parseQueryAction(STNode queryConstructType, STNode queryPipeline, STNode selectClause) {
private STNode parseQueryAction(STNode queryConstructType, STNode queryPipeline, STNode selectClause,
STNode collectClause) {
if (queryConstructType != null) {
queryPipeline = SyntaxErrors.cloneWithLeadingInvalidNodeMinutiae(queryPipeline, queryConstructType,
DiagnosticErrorCode.ERROR_QUERY_CONSTRUCT_TYPE_IN_QUERY_ACTION);
Expand All @@ -13562,6 +13564,10 @@ private STNode parseQueryAction(STNode queryConstructType, STNode queryPipeline,
queryPipeline = SyntaxErrors.cloneWithTrailingInvalidNodeMinutiae(queryPipeline, selectClause,
DiagnosticErrorCode.ERROR_SELECT_CLAUSE_IN_QUERY_ACTION);
}
if (collectClause != null) {
queryPipeline = SyntaxErrors.cloneWithTrailingInvalidNodeMinutiae(queryPipeline, collectClause,
DiagnosticErrorCode.ERROR_COLLECT_CLAUSE_IN_QUERY_ACTION);
}

startContext(ParserRuleContext.DO_CLAUSE);
STNode doKeyword = parseDoKeyword();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ error.invalid.token=invalid token ''{0}''
error.invalid.expression.statement=invalid expression statement
error.invalid.array.length=invalid array length: array length should be a non-negative integer
error.select.clause.in.query.action=select clause in query action
error.collect.clause.in.query.action=collect clause in query action
error.more.clauses.after.select.clause=more clauses after select clause
error.more.clauses.after.collect.clause=more clauses after collect clause
error.query.construct.type.in.query.action= query construct type in query action
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,16 @@ public void testQueryActionWithLimit() {
testFile("query-action/query_action_source_05.bal", "query-action/query_action_assert_05.json");
}

@Test
public void testQueryActionWithGroupBy() {
testFile("query-action/query_action_source_07.bal", "query-action/query_action_assert_07.json");
}

@Test
public void testQueryActionWithCollect() {
testFile("query-action/query_action_source_08.bal", "query-action/query_action_assert_08.json");
}

// Recovery tests

@Test
Expand Down
Loading

0 comments on commit 859fff4

Please sign in to comment.