This is an automated email from the ASF dual-hosted git repository. xiangweiwei pushed a commit to branch nowBug in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d3615e711165724264d9359280dcb2a311905d08 Author: Alima777 <[email protected]> AuthorDate: Sat Jul 3 17:08:39 2021 +0800 fix now() bug --- .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 41 +++++++++++++++++++--- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java index cd2dfe3..737423b 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java @@ -1832,19 +1832,20 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> { TimeIntervalContext timeInterval, GroupByClauseComponent groupByClauseComponent) { long startTime; long endTime; + long currentTime = DatetimeUtils.currentTime(); if (timeInterval.timeValue(0).INT() != null) { startTime = Long.parseLong(timeInterval.timeValue(0).INT().getText()); } else if (timeInterval.timeValue(0).dateExpression() != null) { - startTime = parseDateExpression(timeInterval.timeValue(0).dateExpression()); + startTime = parseDateExpression(timeInterval.timeValue(0).dateExpression(), currentTime); } else { - startTime = parseTimeFormat(timeInterval.timeValue(0).dateFormat().getText()); + startTime = parseTimeFormat(timeInterval.timeValue(0).dateFormat().getText(), currentTime); } if (timeInterval.timeValue(1).INT() != null) { endTime = Long.parseLong(timeInterval.timeValue(1).INT().getText()); } else if (timeInterval.timeValue(1).dateExpression() != null) { - endTime = parseDateExpression(timeInterval.timeValue(1).dateExpression()); + endTime = parseDateExpression(timeInterval.timeValue(1).dateExpression(), currentTime); } else { - endTime = parseTimeFormat(timeInterval.timeValue(1).dateFormat().getText()); + endTime = parseTimeFormat(timeInterval.timeValue(1).dateFormat().getText(), currentTime); } groupByClauseComponent.setStartTime(startTime); @@ -2071,6 +2072,19 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> { return time; } + private Long parseDateExpression(DateExpressionContext ctx, long currentTime) { + long time; + time = parseTimeFormat(ctx.getChild(0).getText(), currentTime); + for (int i = 1; i < ctx.getChildCount(); i = i + 2) { + if (ctx.getChild(i).getText().equals("+")) { + time += DatetimeUtils.convertDurationStrToLong(time, ctx.getChild(i + 1).getText()); + } else { + time -= DatetimeUtils.convertDurationStrToLong(time, ctx.getChild(i + 1).getText()); + } + } + return time; + } + /** * parse time unit or sliding step in group by query. * @@ -2322,4 +2336,23 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> { timestampStr)); } } + + public long parseTimeFormat(String timestampStr, long currentTime) throws SQLParserException { + if (timestampStr == null || timestampStr.trim().equals("")) { + throw new SQLParserException("input timestamp cannot be empty"); + } + if (timestampStr.equalsIgnoreCase(SQLConstant.NOW_FUNC)) { + return currentTime; + } + try { + return DatetimeUtils.convertDatetimeStrToLong(timestampStr, zoneId); + } catch (Exception e) { + throw new SQLParserException( + String.format( + "Input time format %s error. " + + "Input like yyyy-MM-dd HH:mm:ss, yyyy-MM-ddTHH:mm:ss or " + + "refer to user document for more info.", + timestampStr)); + } + } }
