This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch rel/0.11
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/0.11 by this push:
new a25fd13 [To rel/0.11] Bug fix: time interval is parsed incorrectly
(#3505)
a25fd13 is described below
commit a25fd13156dc81784df762ca42629b393cd383ee
Author: Xiangwei Wei <[email protected]>
AuthorDate: Mon Jul 5 12:13:19 2021 +0800
[To rel/0.11] Bug fix: time interval is parsed incorrectly (#3505)
---
.../apache/iotdb/db/qp/constant/DatetimeUtils.java | 15 ++++++
.../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 55 +++++++++++++++-------
2 files changed, 54 insertions(+), 16 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java
b/server/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java
index 2e3dc65..075a6f8 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/constant/DatetimeUtils.java
@@ -537,6 +537,21 @@ public class DatetimeUtils {
}
+ public static long currentTime() {
+ long startupNano =
IoTDBDescriptor.getInstance().getConfig().getStartUpNanosecond();
+ String timePrecision =
IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
+ switch (timePrecision) {
+ case "ns":
+ return System.currentTimeMillis() * 1000_000
+ + (System.nanoTime() - startupNano) % 1000_000;
+ case "us":
+ return System.currentTimeMillis() * 1000
+ + (System.nanoTime() - startupNano) / 1000 % 1000;
+ default:
+ return System.currentTimeMillis();
+ }
+ }
+
public static ZoneOffset toZoneOffset(ZoneId zoneId) {
return zoneId.getRules().getOffset(Instant.now());
}
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..cb50188 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 += parseDuration(ctx.getChild(i + 1).getText());
+ } else {
+ time -= parseDuration(ctx.getChild(i + 1).getText());
+ }
+ }
+ return time;
+ }
+
/**
* parse duration to time value.
*
@@ -1743,19 +1757,28 @@ public class IoTDBSqlVisitor extends
SqlBaseBaseVisitor<Operator> {
if (timestampStr == null || timestampStr.trim().equals("")) {
throw new SQLParserException("input timestamp cannot be empty");
}
- long startupNano =
IoTDBDescriptor.getInstance().getConfig().getStartUpNanosecond();
+
if (timestampStr.equalsIgnoreCase(SQLConstant.NOW_FUNC)) {
- String timePrecision =
IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
- switch (timePrecision) {
- case "ns":
- return System.currentTimeMillis() * 1000_000
- + (System.nanoTime() - startupNano) % 1000_000;
- case "us":
- return System.currentTimeMillis() * 1000
- + (System.nanoTime() - startupNano) / 1000 % 1000;
- default:
- return System.currentTimeMillis();
- }
+ return DatetimeUtils.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));
+ }
+ }
+
+ 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);