This is an automated email from the ASF dual-hosted git repository.

xiangweiwei pushed a commit to branch nowBug
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit d3615e711165724264d9359280dcb2a311905d08
Author: Alima777 <[email protected]>
AuthorDate: Sat Jul 3 17:08:39 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 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));
+    }
+  }
 }

Reply via email to