This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new fccbadd [IOTDB-718]Fix wrong time precision of NOW() (#1290)
fccbadd is described below
commit fccbadd322f849e775e8e52cd382603998f8d211
Author: wshao08 <[email protected]>
AuthorDate: Mon Jun 1 13:47:53 2020 +0800
[IOTDB-718]Fix wrong time precision of NOW() (#1290)
* Fix wrong time precision of NOW()
---
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 8 +++++++-
.../iotdb/db/qp/strategy/LogicalGenerator.java | 13 ++++++++++++-
.../iotdb/db/qp/strategy/LogicalGeneratorTest.java | 21 +++++++++++++++++++++
3 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 162a69b..1c29d56 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -575,6 +575,8 @@ public class IoTDBConfig {
// the authorizer provider class which extends BasicAuthorizer
private String authorizerProvider =
"org.apache.iotdb.db.auth.authorizer.LocalFileAuthorizer";
+ // time in nanosecond precision when starting up
+ private long startUpNanosecond = System.nanoTime();
public IoTDBConfig() {
// empty constructor
@@ -748,7 +750,7 @@ public class IoTDBConfig {
return timestampPrecision;
}
- void setTimestampPrecision(String timestampPrecision) {
+ public void setTimestampPrecision(String timestampPrecision) {
if (!(timestampPrecision.equals("ms") || timestampPrecision.equals("us")
|| timestampPrecision.equals("ns"))) {
logger.error("Wrong timestamp precision, please set as: ms, us or ns !
Current is: "
@@ -1583,4 +1585,8 @@ public class IoTDBConfig {
public void setAuthorizerProvider(String authorizerProvider) {
this.authorizerProvider = authorizerProvider;
}
+
+ public long getStartUpNanosecond() {
+ return startUpNanosecond;
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
index 83592c6..d71784c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.qp.strategy;
import java.io.File;
+import java.time.Instant;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.EnumMap;
@@ -162,6 +163,7 @@ import
org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.filter.operator.In;
import org.apache.iotdb.tsfile.utils.StringContainer;
/**
@@ -1474,8 +1476,17 @@ public class LogicalGenerator extends
SqlBaseBaseListener {
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)) {
- return System.currentTimeMillis();
+ 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();
+ }
}
try {
return DatetimeUtils.convertDatetimeStrToLong(timestampStr, zoneId);
diff --git
a/server/src/test/java/org/apache/iotdb/db/qp/strategy/LogicalGeneratorTest.java
b/server/src/test/java/org/apache/iotdb/db/qp/strategy/LogicalGeneratorTest.java
index f3e5ea2..c19a69c 100644
---
a/server/src/test/java/org/apache/iotdb/db/qp/strategy/LogicalGeneratorTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/qp/strategy/LogicalGeneratorTest.java
@@ -24,6 +24,7 @@ import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.exception.query.LogicalOperatorException;
import org.apache.iotdb.db.exception.runtime.SQLParserException;
import org.apache.iotdb.db.qp.constant.SQLConstant;
@@ -66,6 +67,26 @@ public class LogicalGeneratorTest {
}
+ @Test
+ public void testParseTimeFormatNowPrecision() throws
LogicalOperatorException {
+ String timePrecision =
IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
+ IoTDBDescriptor.getInstance().getConfig().setTimestampPrecision("ms");
+ long now_ms = generator.parseTimeFormat(SQLConstant.NOW_FUNC);
+ String ms_str = String.valueOf(now_ms);
+
+ IoTDBDescriptor.getInstance().getConfig().setTimestampPrecision("us");
+ long now_us = generator.parseTimeFormat(SQLConstant.NOW_FUNC);
+ String us_str = String.valueOf(now_us);
+
+ IoTDBDescriptor.getInstance().getConfig().setTimestampPrecision("ns");
+ long now_ns = generator.parseTimeFormat(SQLConstant.NOW_FUNC);
+ String ns_str = String.valueOf(now_ns);
+
+ assertEquals(ms_str.length() + 3, (us_str).length());
+ assertEquals(us_str.length() + 3, (ns_str).length());
+
IoTDBDescriptor.getInstance().getConfig().setTimestampPrecision(timePrecision);
+ }
+
@Test(expected = SQLParserException.class)
public void testParseTimeFormatFail1() throws LogicalOperatorException {
generator.parseTimeFormat(null);