You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/07/05 02:19:58 UTC
[iotdb] branch master updated: Bug fix: time interval is parsed
incorrectly (#3500)
This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new d6b8dff Bug fix: time interval is parsed incorrectly (#3500)
d6b8dff is described below
commit d6b8dff38f912ab3bf222f4c15bfe8356e1804aa
Author: Xiangwei Wei <34...@users.noreply.github.com>
AuthorDate: Mon Jul 5 10:19:34 2021 +0800
Bug fix: time interval is parsed incorrectly (#3500)
---
.../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));
+ }
+ }
}