This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/mppSqlParserBug in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 6d3e68ec7ed22d2be5237bfbff25d7986df78317 Author: liuminghui233 <[email protected]> AuthorDate: Sat May 28 22:40:13 2022 +0800 fix sql parser error in GroupByFill --- .../iotdb/db/mpp/plan/parser/ASTVisitor.java | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java index f01b7b1a61..652a8dbe3a 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java @@ -754,6 +754,23 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { return queryStatement; } + @Override + public Statement visitGroupByFillStatement(IoTDBSqlParser.GroupByFillStatementContext ctx) { + // parse group by time clause & fill clause + parseGroupByTimeClause(ctx.groupByFillClause()); + + // parse order by time + if (ctx.orderByTimeClause() != null) { + parseOrderByTimeClause(ctx.orderByTimeClause()); + } + + // parse limit & offset + if (ctx.specialLimit() != null) { + return visit(ctx.specialLimit()); + } + return queryStatement; + } + private void parseGroupByTimeClause(IoTDBSqlParser.GroupByTimeClauseContext ctx) { GroupByTimeComponent groupByTimeComponent = new GroupByTimeComponent(); @@ -800,6 +817,41 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { queryStatement.setGroupByTimeComponent(groupByTimeComponent); } + private void parseGroupByTimeClause(IoTDBSqlParser.GroupByFillClauseContext ctx) { + GroupByTimeComponent groupByTimeComponent = new GroupByTimeComponent(); + + // parse time range + parseTimeRange(ctx.timeRange(), groupByTimeComponent); + groupByTimeComponent.setLeftCRightO(ctx.timeRange().LS_BRACKET() != null); + + // parse time interval + groupByTimeComponent.setInterval( + parseTimeIntervalOrSlidingStep( + ctx.DURATION_LITERAL(0).getText(), true, groupByTimeComponent)); + if (groupByTimeComponent.getInterval() <= 0) { + throw new SemanticException( + "The second parameter time interval should be a positive integer."); + } + + // parse sliding step + if (ctx.DURATION_LITERAL().size() == 2) { + groupByTimeComponent.setSlidingStep( + parseTimeIntervalOrSlidingStep( + ctx.DURATION_LITERAL(1).getText(), false, groupByTimeComponent)); + } else { + groupByTimeComponent.setSlidingStep(groupByTimeComponent.getInterval()); + groupByTimeComponent.setSlidingStepByMonth(groupByTimeComponent.isIntervalByMonth()); + } + + // parse fill clause + if (ctx.fillClause() != null) { + parseFillClause(ctx.fillClause()); + } + + // set groupByTimeComponent + queryStatement.setGroupByTimeComponent(groupByTimeComponent); + } + /** parse time range (startTime and endTime) in group by query. */ private void parseTimeRange( IoTDBSqlParser.TimeRangeContext timeRange, GroupByTimeComponent groupByClauseComponent) {
