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);

Reply via email to