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

jiangtian pushed a commit to branch dev_TTL
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/dev_TTL by this push:
     new 499de7b  fix losing ttl after restart add show ttl
499de7b is described below

commit 499de7b648980668df137d01d417c5caa1c395e7
Author: jt <[email protected]>
AuthorDate: Mon Sep 23 12:41:05 2019 +0800

    fix losing ttl after restart
    add show ttl
---
 .../1-IoTDB Query Statement.md                     | 10 +++++
 .../1-IoTDB Query Statement.md                     | 10 +++++
 .../org/apache/iotdb/db/sql/parse/TSParser.g       | 19 +++++++++
 .../org/apache/iotdb/db/conf/IoTDBConstant.java    | 17 +++-----
 .../org/apache/iotdb/db/metadata/MManager.java     |  2 +-
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |  2 +
 .../qp/executor/AbstractQueryProcessExecutor.java  | 49 +++++++++++++++++++++-
 .../iotdb/db/qp/executor/QueryProcessExecutor.java | 34 +++++++--------
 .../sys/{TTLOperator.java => SetTTLOperator.java}  |  4 +-
 .../iotdb/db/qp/logical/sys/ShowTTLOperator.java   | 24 +++++++++++
 .../physical/sys/{TTLPlan.java => SetTTLPlan.java} |  6 +--
 .../iotdb/db/qp/physical/sys/ShowTTLPlan.java      | 30 +++++++++++++
 .../iotdb/db/qp/strategy/LogicalGenerator.java     | 19 +++++++--
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    | 22 ++++++----
 .../dataset/{AuthDataSet.java => ListDataSet.java} |  4 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 37 ++++++++++------
 .../iotdb/db/engine/storagegroup/TTLTest.java      | 44 +++++++++++++++++--
 .../apache/iotdb/db/integration/IoTDBTTLTest.java  | 43 +++++++++++++++++++
 18 files changed, 310 insertions(+), 66 deletions(-)

diff --git a/docs/Documentation-CHN/UserGuide/5-IoTDB SQL Documentation/1-IoTDB 
Query Statement.md b/docs/Documentation-CHN/UserGuide/5-IoTDB SQL 
Documentation/1-IoTDB Query Statement.md
index 24b024f..1b98f57 100644
--- a/docs/Documentation-CHN/UserGuide/5-IoTDB SQL Documentation/1-IoTDB Query 
Statement.md     
+++ b/docs/Documentation-CHN/UserGuide/5-IoTDB SQL Documentation/1-IoTDB Query 
Statement.md     
@@ -496,6 +496,16 @@ Eg. UNSET TTL TO root.group1
 这个例子展示了如何取消存储组root.group1的TTL,这将使得该存储组接受任意时刻的数据。
 ```
 
+* 显示 TTL
+```
+SHOW ALL TTL
+SHOW TTL ON StorageGroupNames
+Eg.1 SHOW ALL TTL
+这个例子会给出所有存储组的TTL。
+Eg.2 SHOW TTL ON root.group1,root.group2,root.group3
+这个例子会显示指定的三个存储组的TTL。
+```
+
 注意:当你对某个存储组设置TTL的时候,超过TTL范围的数据将会立即不可见。但由于数据文件可能混合包含处在TTL范围内
 与范围外的数据,同时数据文件可能正在接受查询,数据文件的物理删除不会立即进行。如果你在此时取消或者调大TTL,
 一部分之前不可见的数据可能重新可见,而那些已经被物理删除的数据则将永久丢失。因此我们不推荐您修改或是频繁修改TTL,
diff --git a/docs/Documentation/UserGuide/5-IoTDB SQL Documentation/1-IoTDB 
Query Statement.md b/docs/Documentation/UserGuide/5-IoTDB SQL 
Documentation/1-IoTDB Query Statement.md
index b5d2830..df7fd3f 100644
--- a/docs/Documentation/UserGuide/5-IoTDB SQL Documentation/1-IoTDB Query 
Statement.md 
+++ b/docs/Documentation/UserGuide/5-IoTDB SQL Documentation/1-IoTDB Query 
Statement.md 
@@ -527,6 +527,16 @@ Eg. UNSET TTL TO root.group1
 This example means that data of all time will be stored in this group. 
 ```
 
+* Show TTL
+```
+SHOW ALL TTL
+SHOW TTL ON StorageGroupNames
+Eg.1 SHOW ALL TTL
+This example will show TTLs of all storage groups.
+Eg.2 SHOW TTL ON root.group1,root.group2,root.group3
+This example will show TTLs if the specified 3 groups.
+```
+
 Notice: When you set TTL to some storage groups, data out of the TTL will be 
made invisible
 immediately, but because the data files may contain both out-dated and living 
data or the data files may
 be being used by queries, the physical removal of data is stale. If you 
increase or unset TTL
diff --git a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g 
b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
index 927a49d..c70aa07 100644
--- a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
+++ b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
@@ -105,6 +105,7 @@ TOK_LINK;
 TOK_UNLINK;
 TOK_STORAGEGROUP;
 TOK_DESCRIBE;
+TOK_SHOW;
 }
 
 
@@ -909,10 +910,19 @@ constant
     | dateFormat
     ;
 
+/*
+****
+*************
+TTL
+*************
+****
+*/
+
 ttlStatement
     :
     setTTLStatement
     | unsetTTLStatement
+    | showTTLStatement
     ;
 
 setTTLStatement
@@ -925,4 +935,13 @@ unsetTTLStatement
     :
      KW_UNSET KW_TTL KW_TO path=prefixPath
     -> ^(TOK_TTL TOK_UNSET $path)
+    ;
+
+showTTLStatement
+    :
+    KW_SHOW KW_TTL KW_ON prefixPath (COMMA prefixPath)*
+    -> ^(TOK_TTL TOK_SHOW prefixPath+)
+    |
+    KW_SHOW KW_ALL KW_TTL
+    -> ^(TOK_TTL TOK_SHOW)
     ;
\ No newline at end of file
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java 
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
index 9f6bbe1..6a23a35 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
@@ -61,17 +61,10 @@ public class IoTDBConstant {
 
   public static final String SHOW_DYNAMIC_PARAMETERS = 
"show\\s+dynamic\\s+parameters";
 
-  public static final String ROLE = "Role";
-  public static final String USER = "User";
-  public static final String PRIVILEGE = "Privilege";
+  public static final String ROLE = "role";
+  public static final String USER = "user";
+  public static final String PRIVILEGE = "privilege";
 
-  // JDBC constants
-  public static final String GLOBAL_COLUMN_REQ = "COLUMN";
-  public static final String GLOBAL_DELTA_OBJECT_REQ = "DELTA_OBJECT";
-  public static final String GLOBAL_SHOW_TIMESERIES_REQ = "SHOW_TIMESERIES";
-  public static final String GLOBAL_COUNT_TIMESERIES_REQ = "COUNT_TIMESERIES";
-  public static final String GLOBAL_COUNT_NODE_TIMESERIES_REQ = 
"COUNT_NODE_TIMESERIES";
-  public static final String GLOBAL_COUNT_NODES_REQ = "COUNT_NODES";
-  public static final String GLOBAL_SHOW_STORAGE_GROUP_REQ = 
"SHOW_STORAGE_GROUP";
-  public static final String GLOBAL_COLUMNS_REQ = "ALL_COLUMNS";
+  public static final String STORAGE_GROUP = "storage group";
+  public static final String TTL = "ttl";
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 20f4fd7..da273fa 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -1250,7 +1250,7 @@ public class MManager {
       sgNode.setDataTTL(dataTTL);
       if (writeToLog) {
         BufferedWriter writer = getLogWriter();
-        writer.write(String.format("%s,%s,%s", OperatorType.TTL, storageGroup, 
dataTTL));
+        writer.write(String.format("%s,%s,%s", MetadataOperationType.SET_TTL, 
storageGroup, dataTTL));
         writer.newLine();
         writer.flush();
       }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java 
b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
index e03251c..fa0f7fd 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
@@ -94,6 +94,7 @@ public class SQLConstant {
   public static final int TOK_LIST = 59;
   public static final int TOK_SET = 60;
   public static final int TOK_UNSET = 61;
+  public static final int TOK_SHOW = 62;
 
   public static final Map<Integer, String> tokenSymbol = new HashMap<>();
   public static final Map<Integer, String> tokenNames = new HashMap<>();
@@ -151,6 +152,7 @@ public class SQLConstant {
     tokenNames.put(TOK_LIST, "TOK_LIST");
     tokenNames.put(TOK_SET, "TOK_SET");
     tokenNames.put(TOK_UNSET, "TOK_UNSET");
+    tokenNames.put(TOK_SHOW, "TOK_SHOW");
   }
 
   static {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
index b3cb92c..b2ec4f3 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/AbstractQueryProcessExecutor.java
@@ -18,14 +18,20 @@
  */
 package org.apache.iotdb.db.qp.executor;
 
+import static org.apache.iotdb.db.conf.IoTDBConstant.STORAGE_GROUP;
+import static org.apache.iotdb.db.conf.IoTDBConstant.TTL;
+
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
-import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.MetadataErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
+import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.metadata.MManager;
+import org.apache.iotdb.db.metadata.MNode;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
 import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
@@ -33,17 +39,23 @@ import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.dataset.ListDataSet;
 import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
 import 
org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.Field;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.expression.QueryExpression;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.iotdb.tsfile.utils.Binary;
 
 public abstract class AbstractQueryProcessExecutor implements 
IQueryProcessExecutor {
 
-  protected IEngineQueryRouter queryRouter = new EngineQueryRouter();
+  IEngineQueryRouter queryRouter = new EngineQueryRouter();
 
   @Override
   public QueryDataSet processQuery(PhysicalPlan queryPlan, QueryContext 
context)
@@ -54,11 +66,44 @@ public abstract class AbstractQueryProcessExecutor 
implements IQueryProcessExecu
       return processDataQuery((QueryPlan) queryPlan, context);
     } else if (queryPlan instanceof AuthorPlan) {
       return processAuthorQuery((AuthorPlan) queryPlan, context);
+    } else if(queryPlan instanceof ShowTTLPlan) {
+      return processShowTTLQuery((ShowTTLPlan) queryPlan);
     } else {
       throw new ProcessorException(String.format("Unrecognized query plan %s", 
queryPlan));
     }
   }
 
+  private QueryDataSet processShowTTLQuery(ShowTTLPlan showTTLPlan) {
+    List<Path> paths = new ArrayList<>();
+    paths.add(new Path(STORAGE_GROUP));
+    paths.add(new Path(TTL));
+    List<TSDataType> dataTypes = new ArrayList<>();
+    dataTypes.add(TSDataType.TEXT);
+    dataTypes.add(TSDataType.INT64);
+    ListDataSet listDataSet = new ListDataSet(paths, dataTypes);
+
+    List<String> selectedSgs = showTTLPlan.getStorageGroups();
+
+    List<MNode> storageGroups = MManager.getInstance().getAllStorageGroups();
+    int i = 0;
+    for (MNode mNode : storageGroups) {
+      String sgName = mNode.getFullPath();
+      if (!selectedSgs.isEmpty() && !selectedSgs.contains(sgName)) {
+        continue;
+      }
+      RowRecord rowRecord = new RowRecord(i++);
+      Field sg = new Field(TSDataType.TEXT);
+      Field ttl = new Field(TSDataType.INT64);
+      sg.setBinaryV(new Binary(sgName));
+      ttl.setLongV(mNode.getDataTTL());
+      rowRecord.addField(sg);
+      rowRecord.addField(ttl);
+      listDataSet.putRecord(rowRecord);
+    }
+
+    return listDataSet;
+  }
+
   protected abstract QueryDataSet processAuthorQuery(AuthorPlan plan, 
QueryContext context)
       throws ProcessorException;
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
index b2abcb5..20179b6 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/QueryProcessExecutor.java
@@ -54,9 +54,9 @@ import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
 import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
 import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
 import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
-import org.apache.iotdb.db.qp.physical.sys.TTLPlan;
+import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
-import org.apache.iotdb.db.query.dataset.AuthDataSet;
+import org.apache.iotdb.db.query.dataset.ListDataSet;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.db.utils.AuthUtils;
 import 
org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
@@ -121,7 +121,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
         PropertyPlan property = (PropertyPlan) plan;
         return operateProperty(property);
       case TTL:
-        operateTTL((TTLPlan) plan);
+        operateTTL((SetTTLPlan) plan);
         return true;
       default:
         throw new UnsupportedOperationException(
@@ -129,7 +129,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     }
   }
 
-  private void operateTTL(TTLPlan plan) throws ProcessorException {
+  private void operateTTL(SetTTLPlan plan) throws ProcessorException {
     try {
       MManager.getInstance().setTTL(plan.getStorageGroup(), plan.getDataTTL());
       StorageEngine.getInstance().setTTL(plan.getStorageGroup(), 
plan.getDataTTL());
@@ -479,7 +479,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
       throw new ProcessorException(e);
     }
 
-    AuthDataSet dataSet;
+    ListDataSet dataSet;
 
     try {
       switch (authorType) {
@@ -510,13 +510,13 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     return dataSet;
   }
 
-  private AuthDataSet executeListRole(IAuthorizer authorizer) {
+  private ListDataSet executeListRole(IAuthorizer authorizer) {
     int index = 0;
     List<Path> headerList = new ArrayList<>();
     List<TSDataType> typeList = new ArrayList<>();
     headerList.add(new Path(ROLE));
     typeList.add(TSDataType.TEXT);
-    AuthDataSet dataSet = new AuthDataSet(headerList, typeList);
+    ListDataSet dataSet = new ListDataSet(headerList, typeList);
     List<String> roleList = authorizer.listAllRoles();
     for (String role : roleList) {
       RowRecord record = new RowRecord(index++);
@@ -528,14 +528,14 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     return dataSet;
   }
 
-  private AuthDataSet executeListUser(IAuthorizer authorizer) {
+  private ListDataSet executeListUser(IAuthorizer authorizer) {
     List<String> userList = authorizer.listAllUsers();
     List<Path> headerList = new ArrayList<>();
     List<TSDataType> typeList = new ArrayList<>();
     headerList.add(new Path(USER));
     typeList.add(TSDataType.TEXT);
     int index = 0;
-    AuthDataSet dataSet = new AuthDataSet(headerList, typeList);
+    ListDataSet dataSet = new ListDataSet(headerList, typeList);
     for (String user : userList) {
       RowRecord record = new RowRecord(index++);
       Field field = new Field(TSDataType.TEXT);
@@ -546,7 +546,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     return dataSet;
   }
 
-  private AuthDataSet executeListRoleUsers(IAuthorizer authorizer, String 
roleName)
+  private ListDataSet executeListRoleUsers(IAuthorizer authorizer, String 
roleName)
       throws AuthException {
     Role role = authorizer.getRole(roleName);
     if (role == null) {
@@ -556,7 +556,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     List<TSDataType> typeList = new ArrayList<>();
     headerList.add(new Path(USER));
     typeList.add(TSDataType.TEXT);
-    AuthDataSet dataSet = new AuthDataSet(headerList, typeList);
+    ListDataSet dataSet = new ListDataSet(headerList, typeList);
     List<String> userList = authorizer.listAllUsers();
     int index = 0;
     for (String userN : userList) {
@@ -572,7 +572,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     return dataSet;
   }
 
-  private AuthDataSet executeListUserRoles(IAuthorizer authorizer, String 
userName)
+  private ListDataSet executeListUserRoles(IAuthorizer authorizer, String 
userName)
       throws AuthException {
     User user = authorizer.getUser(userName);
     if (user != null) {
@@ -580,7 +580,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
       List<TSDataType> typeList = new ArrayList<>();
       headerList.add(new Path(ROLE));
       typeList.add(TSDataType.TEXT);
-      AuthDataSet dataSet = new AuthDataSet(headerList, typeList);
+      ListDataSet dataSet = new ListDataSet(headerList, typeList);
       int index = 0;
       for (String roleN : user.getRoleList()) {
         RowRecord record = new RowRecord(index++);
@@ -595,7 +595,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     }
   }
 
-  private AuthDataSet executeListRolePrivileges(IAuthorizer authorizer, String 
roleName, Path path)
+  private ListDataSet executeListRolePrivileges(IAuthorizer authorizer, String 
roleName, Path path)
       throws AuthException {
     Role role = authorizer.getRole(roleName);
     if (role != null) {
@@ -603,7 +603,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
       List<TSDataType> typeList = new ArrayList<>();
       headerList.add(new Path(PRIVILEGE));
       typeList.add(TSDataType.TEXT);
-      AuthDataSet dataSet = new AuthDataSet(headerList, typeList);
+      ListDataSet dataSet = new ListDataSet(headerList, typeList);
       int index = 0;
       for (PathPrivilege pathPrivilege : role.getPrivilegeList()) {
         if (path == null || AuthUtils
@@ -621,7 +621,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     }
   }
 
-  private AuthDataSet executeListUserPrivileges(IAuthorizer authorizer, String 
userName, Path path)
+  private ListDataSet executeListUserPrivileges(IAuthorizer authorizer, String 
userName, Path path)
       throws AuthException {
     User user = authorizer.getUser(userName);
     if (user == null) {
@@ -633,7 +633,7 @@ public class QueryProcessExecutor extends 
AbstractQueryProcessExecutor {
     headerList.add(new Path(PRIVILEGE));
     typeList.add(TSDataType.TEXT);
     typeList.add(TSDataType.TEXT);
-    AuthDataSet dataSet = new AuthDataSet(headerList, typeList);
+    ListDataSet dataSet = new ListDataSet(headerList, typeList);
     int index = 0;
     for (PathPrivilege pathPrivilege : user.getPrivilegeList()) {
       if (path == null || AuthUtils.pathBelongsTo(path.getFullPath(), 
pathPrivilege.getPath())) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TTLOperator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
similarity index 93%
rename from 
server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TTLOperator.java
rename to 
server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
index d336252..d842165 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TTLOperator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
@@ -22,12 +22,12 @@ package org.apache.iotdb.db.qp.logical.sys;
 
 import org.apache.iotdb.db.qp.logical.RootOperator;
 
-public class TTLOperator extends RootOperator {
+public class SetTTLOperator extends RootOperator {
 
   private String storageGroup;
   private long dataTTL;
 
-  public TTLOperator(int tokenIntType) {
+  public SetTTLOperator(int tokenIntType) {
     super(tokenIntType);
     this.operatorType = OperatorType.TTL;
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
new file mode 100644
index 0000000..7ec6830
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file distributed with this work 
for additional information regarding copyright ownership.  The ASF licenses 
this file to you under the Apache License, Version 2.0 (the "License"); you may 
not use this file except in compliance with the License.  You may obtain a copy 
of the License at      http://www.apache.org/licenses/LICENSE-2.0  Unless 
required by applicable law or ag [...]
+ */
+
+package org.apache.iotdb.db.qp.logical.sys;
+
+import java.util.List;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.logical.RootOperator;
+
+public class ShowTTLOperator extends RootOperator {
+
+  private List<String> storageGroups;
+
+  public ShowTTLOperator(List<String> storageGroups) {
+    super(SQLConstant.TOK_SHOW);
+    this.operatorType = OperatorType.TTL;
+    this.storageGroups = storageGroups;
+  }
+
+  public List<String> getStorageGroups() {
+    return storageGroups;
+  }
+}
\ No newline at end of file
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/TTLPlan.java 
b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTTLPlan.java
similarity index 91%
rename from 
server/src/main/java/org/apache/iotdb/db/qp/physical/sys/TTLPlan.java
rename to 
server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTTLPlan.java
index 30c0388..268d554 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/TTLPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/SetTTLPlan.java
@@ -25,19 +25,19 @@ import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.tsfile.read.common.Path;
 
-public class TTLPlan extends PhysicalPlan {
+public class SetTTLPlan extends PhysicalPlan {
 
   private String storageGroup;
   private long dataTTL;
 
-  public TTLPlan(String storageGroup, long dataTTL) {
+  public SetTTLPlan(String storageGroup, long dataTTL) {
     // set TTL
     super(false, OperatorType.TTL);
     this.storageGroup = storageGroup;
     this.dataTTL = dataTTL;
   }
 
-  public TTLPlan(String storageGroup) {
+  public SetTTLPlan(String storageGroup) {
     // unset TTL
     this(storageGroup, Long.MAX_VALUE);
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowTTLPlan.java 
b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowTTLPlan.java
new file mode 100644
index 0000000..5061b4e
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowTTLPlan.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file distributed with this work 
for additional information regarding copyright ownership.  The ASF licenses 
this file to you under the Apache License, Version 2.0 (the "License"); you may 
not use this file except in compliance with the License.  You may obtain a copy 
of the License at      http://www.apache.org/licenses/LICENSE-2.0  Unless 
required by applicable law or ag [...]
+ */
+
+package org.apache.iotdb.db.qp.physical.sys;
+
+import java.util.List;
+import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.tsfile.read.common.Path;
+
+public class ShowTTLPlan extends PhysicalPlan {
+
+  private List<String> storageGroups;
+
+  public ShowTTLPlan(List<String> storageGroups) {
+    super(true);
+    this.storageGroups = storageGroups;
+    setOperatorType(OperatorType.TTL);
+  }
+
+  @Override
+  public List<Path> getPaths() {
+    return null;
+  }
+
+  public List<String> getStorageGroups() {
+    return storageGroups;
+  }
+}
\ No newline at end of file
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 651cc64..a6a8547 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
@@ -51,7 +51,8 @@ import org.apache.iotdb.db.qp.logical.sys.DataAuthOperator;
 import org.apache.iotdb.db.qp.logical.sys.LoadDataOperator;
 import org.apache.iotdb.db.qp.logical.sys.MetadataOperator;
 import org.apache.iotdb.db.qp.logical.sys.PropertyOperator;
-import org.apache.iotdb.db.qp.logical.sys.TTLOperator;
+import org.apache.iotdb.db.qp.logical.sys.SetTTLOperator;
+import org.apache.iotdb.db.qp.logical.sys.ShowTTLOperator;
 import org.apache.iotdb.db.query.fill.IFill;
 import org.apache.iotdb.db.query.fill.LinearFill;
 import org.apache.iotdb.db.query.fill.PreviousFill;
@@ -231,6 +232,9 @@ public class LogicalGenerator {
       case TSParser.TOK_UNSET:
         analyzeUnsetTTL(astNode);
         break;
+      case TSParser.TOK_SHOW:
+        analyzeShowTTL(astNode);
+        break;
       default:
         throw new QueryProcessorException("Not supported TSParser type in 
TTL:" + tokenType);
     }
@@ -240,7 +244,7 @@ public class LogicalGenerator {
     String path = parsePath(astNode.getChild(1)).getFullPath();
     long dataTTL;
     dataTTL = Long.parseLong(astNode.getChild(2).getText());
-    TTLOperator operator = new TTLOperator(SQLConstant.TOK_SET);
+    SetTTLOperator operator = new SetTTLOperator(SQLConstant.TOK_SET);
     initializedOperator = operator;
     operator.setStorageGroup(path);
     operator.setDataTTL(dataTTL);
@@ -248,11 +252,20 @@ public class LogicalGenerator {
 
   private void analyzeUnsetTTL(AstNode astNode) {
     String path = parsePath(astNode.getChild(1)).getFullPath();
-    TTLOperator operator = new TTLOperator(SQLConstant.TOK_UNSET);
+    SetTTLOperator operator = new SetTTLOperator(SQLConstant.TOK_UNSET);
     initializedOperator = operator;
     operator.setStorageGroup(path);
   }
 
+  private void analyzeShowTTL(AstNode astNode) {
+    List<String> storageGroups = new ArrayList<>();
+    for (int i = 1; i < astNode.getChildCount(); i ++) {
+      Path path = parsePath(astNode.getChild(i));
+      storageGroups.add(path.getFullPath());
+    }
+    initializedOperator = new ShowTTLOperator(storageGroups);
+  }
+
   private void analyzeSlimit(AstNode astNode) throws LogicalOperatorException {
     AstNode unit = astNode.getChild(0);
     int seriesLimit;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index ad65b44..18187e9 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -36,7 +36,8 @@ import org.apache.iotdb.db.qp.logical.sys.DataAuthOperator;
 import org.apache.iotdb.db.qp.logical.sys.LoadDataOperator;
 import org.apache.iotdb.db.qp.logical.sys.MetadataOperator;
 import org.apache.iotdb.db.qp.logical.sys.PropertyOperator;
-import org.apache.iotdb.db.qp.logical.sys.TTLOperator;
+import org.apache.iotdb.db.qp.logical.sys.SetTTLOperator;
+import org.apache.iotdb.db.qp.logical.sys.ShowTTLOperator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
 import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
@@ -49,7 +50,8 @@ import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
 import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan;
 import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
 import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
-import org.apache.iotdb.db.qp.physical.sys.TTLPlan;
+import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
 import org.apache.iotdb.db.sql.parse.TSParser;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.expression.IExpression;
@@ -126,12 +128,18 @@ public class PhysicalGenerator {
         QueryOperator query = (QueryOperator) operator;
         return transformQuery(query);
       case TTL:
-        TTLOperator ttlOperator = (TTLOperator) operator;
-        if (ttlOperator.getTokenIntType() == SQLConstant.TOK_SET) {
-          return new TTLPlan(ttlOperator.getStorageGroup(), 
ttlOperator.getDataTTL());
-        } else {
-          return new TTLPlan(ttlOperator.getStorageGroup());
+        switch (operator.getTokenIntType()) {
+          case SQLConstant.TOK_SET:
+            SetTTLOperator setTTLOperator = (SetTTLOperator) operator;
+            return new SetTTLPlan(setTTLOperator.getStorageGroup(), 
setTTLOperator.getDataTTL());
+          case SQLConstant.TOK_UNSET:
+            SetTTLOperator unsetTTLOperator = (SetTTLOperator) operator;
+            return new SetTTLPlan(unsetTTLOperator.getStorageGroup());
+          case SQLConstant.TOK_SHOW:
+            ShowTTLOperator showTTLOperator = (ShowTTLOperator) operator;
+            return new ShowTTLPlan(showTTLOperator.getStorageGroups());
         }
+
       default:
         throw new LogicalOperatorException("not supported operator type: " + 
operator.getType());
     }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/AuthDataSet.java 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/ListDataSet.java
similarity index 94%
rename from 
server/src/main/java/org/apache/iotdb/db/query/dataset/AuthDataSet.java
rename to 
server/src/main/java/org/apache/iotdb/db/query/dataset/ListDataSet.java
index e283378..083a9b2 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/dataset/AuthDataSet.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/ListDataSet.java
@@ -27,12 +27,12 @@ import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 
-public class AuthDataSet extends QueryDataSet {
+public class ListDataSet extends QueryDataSet {
 
   private List<RowRecord> records = new ArrayList<>();
   private int index = 0;
 
-  public AuthDataSet(List<Path> paths,
+  public ListDataSet(List<Path> paths,
       List<TSDataType> dataTypes) {
     super(paths, dataTypes);
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java 
b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 642d6e3..5c9b40c 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -56,6 +56,7 @@ import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
 import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.tools.watermark.GroupedLSBWatermarkEncoder;
@@ -337,7 +338,7 @@ public class TSServiceImpl implements TSIService.Iface, 
ServerContext {
     return MManager.getInstance().getMetadataInString();
   }
 
-  protected Metadata getMetadata()
+  private Metadata getMetadata()
       throws PathErrorException {
     return MManager.getInstance().getMetadata();
   }
@@ -346,10 +347,13 @@ public class TSServiceImpl implements TSIService.Iface, 
ServerContext {
       throws PathErrorException {
     switch (path.toLowerCase()) {
       // authorization queries
-      case "role":
-      case "user":
-      case "privilege":
+      case ROLE:
+      case USER:
+      case PRIVILEGE:
+      case STORAGE_GROUP:
         return TSDataType.TEXT;
+      case TTL:
+        return TSDataType.INT64;
       default:
         // do nothing
     }
@@ -583,10 +587,12 @@ public class TSServiceImpl implements TSIService.Iface, 
ServerContext {
     try {
       TSExecuteStatementResp resp;
       List<String> columns = new ArrayList<>();
-      if (!(plan instanceof AuthorPlan)) {
-        resp = executeDataQuery(plan, columns);
-      } else {
+      if (plan instanceof AuthorPlan) {
         resp = executeAuthQuery(plan, columns);
+      } else if(plan instanceof ShowTTLPlan) {
+        resp = executeShowTTL(columns);
+      } else {
+        resp = executeDataQuery(plan, columns);
       }
       resp.setColumns(columns);
       resp.setDataTypeList(queryColumnsType(columns));
@@ -637,23 +643,28 @@ public class TSServiceImpl implements TSIService.Iface, 
ServerContext {
     return columnTypes;
   }
 
+  private TSExecuteStatementResp executeShowTTL(List<String> columns) {
+    TSExecuteStatementResp resp = 
getTSExecuteStatementResp(getStatus(TSStatusType.SUCCESS_STATUS));
+    resp.setIgnoreTimeStamp(true);
+    columns.add(STORAGE_GROUP);
+    columns.add(TTL);
+
+    return resp;
+  }
+
   private TSExecuteStatementResp executeAuthQuery(PhysicalPlan plan, 
List<String> columns) {
     TSExecuteStatementResp resp = 
getTSExecuteStatementResp(getStatus(TSStatusType.SUCCESS_STATUS));
     resp.setIgnoreTimeStamp(true);
     AuthorPlan authorPlan = (AuthorPlan) plan;
     switch (authorPlan.getAuthorType()) {
       case LIST_ROLE:
+      case LIST_USER_ROLES:
         columns.add(ROLE);
         break;
       case LIST_USER:
-        columns.add(USER);
-        break;
       case LIST_ROLE_USERS:
         columns.add(USER);
         break;
-      case LIST_USER_ROLES:
-        columns.add(ROLE);
-        break;
       case LIST_ROLE_PRIVILEGE:
         columns.add(PRIVILEGE);
         break;
@@ -1012,7 +1023,7 @@ public class TSServiceImpl implements TSIService.Iface, 
ServerContext {
   }
 
   @Override
-  public TSRPCResp deleteData(TSDeleteReq req) throws TException {
+  public TSRPCResp deleteData(TSDeleteReq req) {
     if (!checkLogin()) {
       logger.info(INFO_NOT_LOGIN, IoTDBConstant.GLOBAL_DB_NAME);
       return new TSRPCResp(getStatus(TSStatusType.NOT_LOGIN_ERROR));
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java 
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
index d48a3d6..d8b32bc 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TTLTest.java
@@ -9,6 +9,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -28,16 +29,20 @@ import org.apache.iotdb.db.metadata.MNode;
 import org.apache.iotdb.db.qp.QueryProcessor;
 import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
-import org.apache.iotdb.db.qp.physical.sys.TTLPlan;
+import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import 
org.apache.iotdb.db.query.reader.resourceRelated.SeqResourceIterateReader;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
+import 
org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 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.BatchData;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.common.RowRecord;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -224,16 +229,47 @@ public class TTLTest {
   }
 
   @Test
-  public void testParseTTL()
+  public void testParseSetTTL()
       throws ArgsErrorException, MetadataErrorException, 
QueryProcessorException {
     QueryProcessor queryProcessor = new QueryProcessor(new 
QueryProcessExecutor());
-    TTLPlan plan = (TTLPlan) queryProcessor.parseSQLToPhysicalPlan("SET TTL TO 
" + sg1 + " 10000");
+    SetTTLPlan plan = (SetTTLPlan) queryProcessor.parseSQLToPhysicalPlan("SET 
TTL TO " + sg1 + " 10000");
     assertEquals(sg1, plan.getStorageGroup());
     assertEquals(10000, plan.getDataTTL());
 
-    plan = (TTLPlan) queryProcessor.parseSQLToPhysicalPlan("UNSET TTL TO " + 
sg2);
+    plan = (SetTTLPlan) queryProcessor.parseSQLToPhysicalPlan("UNSET TTL TO " 
+ sg2);
     assertEquals(sg2, plan.getStorageGroup());
     assertEquals(Long.MAX_VALUE, plan.getDataTTL());
   }
 
+  @Test
+  public void testParseShowTTL()
+      throws ArgsErrorException, MetadataErrorException, 
QueryProcessorException {
+    QueryProcessor queryProcessor = new QueryProcessor(new 
QueryProcessExecutor());
+    ShowTTLPlan plan = (ShowTTLPlan) 
queryProcessor.parseSQLToPhysicalPlan("SHOW ALL TTL");
+    assertTrue(plan.getStorageGroups().isEmpty());
+
+    List<String> sgs = new ArrayList<>();
+    sgs.add("root.sg1");
+    sgs.add("root.sg2");
+    sgs.add("root.sg3");
+    plan = (ShowTTLPlan) queryProcessor.parseSQLToPhysicalPlan("SHOW TTL ON 
root.sg1,root.sg2,root.sg3");
+    assertEquals(sgs, plan.getStorageGroups());
+  }
+
+  @Test
+  public void testShowTTL()
+      throws IOException, PathErrorException, ProcessorException, 
QueryFilterOptimizationException, StorageEngineException {
+    MManager.getInstance().setTTL(sg1, ttl);
+
+    ShowTTLPlan plan = new ShowTTLPlan(Collections.emptyList());
+    QueryProcessExecutor executor = new QueryProcessExecutor();
+    QueryDataSet queryDataSet = executor.processQuery(plan, 
EnvironmentUtils.TEST_QUERY_CONTEXT);
+    RowRecord rowRecord = queryDataSet.next();
+    assertEquals(sg2, rowRecord.getFields().get(0).getStringValue());
+    assertEquals(Long.MAX_VALUE, rowRecord.getFields().get(1).getLongV());
+
+    rowRecord = queryDataSet.next();
+    assertEquals(sg1, rowRecord.getFields().get(0).getStringValue());
+    assertEquals(ttl, rowRecord.getFields().get(1).getLongV());
+  }
 }
\ No newline at end of file
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTTLTest.java 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTTLTest.java
index 25ab87c..012ef8f 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTTLTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTTLTest.java
@@ -129,4 +129,47 @@ public class IoTDBTTLTest {
       }
     }
   }
+
+  @Test
+  public void testShowTTL() throws SQLException {
+    try (IoTDBConnection connection = (IoTDBConnection) DriverManager
+        .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", 
"root");
+        Statement statement = connection.createStatement()) {
+      statement.execute("SET STORAGE GROUP TO root.group1");
+      statement.execute("SET STORAGE GROUP TO root.group2");
+
+      String result = doQuery(statement, "SHOW ALL TTL",2 );
+      assertEquals("root.group2,9223372036854775807\n"
+          + "root.group1,9223372036854775807\n", result);
+      result = doQuery(statement, "SHOW TTL ON root.group1",2);
+      assertEquals("root.group1,9223372036854775807\n", result);
+
+      statement.execute("SET TTL TO root.group1 10000");
+      result = doQuery(statement, "SHOW ALL TTL",2);
+      assertEquals("root.group2,9223372036854775807\n"
+          + "root.group1,10000\n", result);
+      result = doQuery(statement, "SHOW TTL ON root.group1",2);
+      assertEquals("root.group1,10000\n", result);
+
+      statement.execute("UNSET TTL TO root.group1");
+      result = doQuery(statement, "SHOW ALL TTL",2);
+      assertEquals("root.group2,9223372036854775807\n"
+          + "root.group1,9223372036854775807\n", result);
+      result = doQuery(statement, "SHOW TTL ON root.group1",2);
+      assertEquals("root.group1,9223372036854775807\n", result);
+    }
+  }
+
+  private String doQuery(Statement statement, String query, int columnSize) 
throws SQLException {
+    ResultSet resultSet = statement.executeQuery(query);
+    StringBuilder ret = new StringBuilder();
+    while (resultSet.next()) {
+      ret.append(resultSet.getString(2));
+      for (int i = 3; i <= columnSize + 1; i++) {
+        ret.append(",").append(resultSet.getString(i));
+      }
+      ret.append("\n");
+    }
+    return ret.toString();
+  }
 }
\ No newline at end of file

Reply via email to