This is an automated email from the ASF dual-hosted git repository. xiangweiwei pushed a commit to branch 0.11nowbug in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 0862a3b6499d9de25ad48b4e1bda3c3fde6f6d09 Author: Alima777 <[email protected]> AuthorDate: Sat Jul 3 17:12:11 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 92ed310..5f62932 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 @@ -1252,19 +1252,20 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> { private void parseTimeInterval(TimeIntervalContext timeInterval, QueryOperator queryOp) { 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); } queryOp.setStartTime(startTime); @@ -1492,6 +1493,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 duration to time value. * @@ -1768,4 +1782,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)); + } + } }
