You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2019/12/10 04:17:29 UTC

[incubator-iotdb] branch master updated: Move show version to server-side (#630)

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 0212fd8  Move show version to server-side (#630)
0212fd8 is described below

commit 0212fd85482fda9437763a32637e16eb3b10d635
Author: Boris <zh...@gmail.com>
AuthorDate: Tue Dec 10 12:17:19 2019 +0800

    Move show version to server-side (#630)
    
    * move show version to the server and use antlr to parse it.
---
 .../main/java/org/apache/iotdb/jdbc/Constant.java  |  3 --
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   | 14 --------
 .../iotdb/jdbc/IoTDBMetadataResultMetadata.java    |  2 +-
 .../apache/iotdb/jdbc/IoTDBMetadataResultSet.java  |  5 ---
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |  5 ---
 .../org/apache/iotdb/db/qp/strategy/SqlBase.g4     |  9 +++--
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |  1 +
 .../qp/executor/AbstractQueryProcessExecutor.java  | 33 +++++++++++------
 .../apache/iotdb/db/qp/physical/sys/ShowPlan.java  |  2 +-
 .../iotdb/db/qp/strategy/LogicalGenerator.java     | 13 +++++--
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  2 ++
 .../dataset/SingleDataSet.java}                    | 41 ++++++++++------------
 .../iotdb/db/query/executor/EngineQueryRouter.java |  2 --
 .../db/query/executor/FillEngineExecutor.java      |  1 -
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 23 +++++++-----
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |  4 +--
 service-rpc/rpc-changelist.md                      |  1 +
 service-rpc/src/main/thrift/rpc.thrift             |  1 -
 18 files changed, 82 insertions(+), 80 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
index bca6af8..fe66e64 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
@@ -24,8 +24,6 @@ public class Constant {
 
   public static final String GLOBAL_DB_NAME = "IoTDB";
 
-  static final String GLOBAL_VERSION = "VERSION";
-
   public static final String GLOBAL_COLUMN_REQ = "COLUMN";
 
   static final String GLOBAL_SHOW_DEVICES_REQ = "SHOW_DEVICES";
@@ -50,7 +48,6 @@ public class Constant {
   public static final String CATALOG_STORAGE_GROUP = "sg";
   public static final String CATALOG_DEVICES = "devices";
   public static final String CATALOG_CHILD_PATHS = "cp";
-  public static final String CATALOG_VERSION = "version";
 
   static final String COUNT_TIMESERIES = "cntts";
   static final String COUNT_NODE_TIMESERIES = "cntnodets";
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
index 433b41a..ae61f30 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
@@ -161,20 +161,6 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
         } catch (TException e) {
           throw new TException("Connection error when fetching timeseries metadata", e);
         }
-      case Constant.CATALOG_VERSION:
-        req = new TSFetchMetadataReq(Constant.GLOBAL_VERSION);
-        req.setColumnPath(schemaPattern);
-        try {
-          TSFetchMetadataResp resp = client.fetchMetadata(req);
-          try {
-            RpcUtils.verifySuccess(resp.getStatus());
-          } catch (IoTDBRPCException e) {
-            throw new IoTDBSQLException(e.getMessage(), resp.getStatus());
-          }
-          return new IoTDBMetadataResultSet(resp.getVersion(), MetadataType.VERSION);
-        } catch (TException e) {
-          throw new TException("Connection error when fetching timeseries metadata", e);
-        }
       default:
         throw new SQLException(catalog + " is not supported. Please refer to the user guide"
             + " for more details.");
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultMetadata.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultMetadata.java
index 3f2cb98..7e43174 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultMetadata.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultMetadata.java
@@ -24,7 +24,7 @@ import java.sql.SQLException;
 import java.sql.Types;
 
 /*
-    TsfileMetadataResultMetadata implements a similar api like TsFileQueryResultSet
+    IoTDBMetadataResultMetadata implements a similar api like IoTDBQueryResultSet
     to display column metadata.
  */
 
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultSet.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultSet.java
index 7df876c..c215c6c 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBMetadataResultSet.java
@@ -44,7 +44,6 @@ public class IoTDBMetadataResultSet extends IoTDBQueryResultSet {
   private String currentStorageGroup;
   private String currentDevice;
   private String currentChildPath;
-  private String currentVersion;
   private List<String> currentTimeseries;
   private List<String> timeseriesNumList;
   private List<String> nodesNumList;
@@ -282,10 +281,6 @@ public class IoTDBMetadataResultSet extends IoTDBQueryResultSet {
           currentNode = (String) pair.getKey();
           currentNodeTimeseriesNum = (String) pair.getValue();
           break;
-        case VERSION:
-          currentVersion = (String) columnItr.next();
-          hasNext = false;
-          break;
         default:
           break;
       }
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
index ca6cd52..f726c3b 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
@@ -53,7 +53,6 @@ public class IoTDBStatement implements Statement {
   private static final String COUNT_TIMESERIES_COMMAND_LOWERCASE = "count timeseries";
   private static final String COUNT_NODES_COMMAND_LOWERCASE = "count nodes";
   private static final String METHOD_NOT_SUPPORTED_STRING = "Method not supported";
-  private static final String SHOW_VERSION_COMMAND_LOWERCASE = "show version";
 
   ZoneId zoneId;
   private ResultSet resultSet = null;
@@ -316,10 +315,6 @@ public class IoTDBStatement implements Statement {
         resultSet = databaseMetaData.getNodes(Constant.COUNT_NODES, path, null, null, level);
         return true;
       }
-    } else if (sqlToLowerCase.equals(SHOW_VERSION_COMMAND_LOWERCASE)) {
-      IoTDBDatabaseMetadata databaseMetadata = (IoTDBDatabaseMetadata) connection.getMetaData();
-      resultSet = databaseMetadata.getColumns(Constant.CATALOG_VERSION, null, null, null);
-      return true;
     } else {
       TSExecuteStatementReq execReq = new TSExecuteStatementReq(sessionHandle, sql, stmtId);
       TSExecuteStatementResp execResp = client.executeStatement(execReq);
diff --git a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4 b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
index aabcca8..784a5b2 100644
--- a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
+++ b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
@@ -69,11 +69,11 @@ statement
     | SHOW ALL TTL #showAllTTLStatement
     | SHOW FLUSH TASK INFO #showFlushTaskInfo
     | SHOW DYNAMIC PARAMETER #showDynamicParameter
+    | SHOW VERSION #showVersion
     | LOAD CONFIGURATION #loadConfigurationStatement
     | LOAD FILE autoCreateSchema? #loadFiles
-    | REMOVE FILE#removeFile
+    | REMOVE FILE #removeFile
     | MOVE FILE FILE #moveFile
-
     | SELECT INDEX func=ID //not support yet
     LR_BRACKET
     p1=timeseriesPath COMMA p2=timeseriesPath COMMA n1=timeValue COMMA n2=timeValue COMMA
@@ -621,6 +621,11 @@ PARAMETER
     : P A R A M E T E R
     ;
 
+
+VERSION
+    : V E R S I O N
+    ;
+
 REMOVE
     : R E M O V E
     ;
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 555736c..dbc81ff 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
@@ -128,6 +128,7 @@ public class SQLConstant {
   public static final int TOK_LOAD_FILES = 69;
   public static final int TOK_REMOVE_FILE = 70;
   public static final int TOK_MOVE_FILE = 71;
+  public static final int TOK_VERSION = 72;
 
   public static final Map<Integer, String> tokenSymbol = new HashMap<>();
   public static final Map<Integer, String> tokenNames = new HashMap<>();
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 dce3286..a0fa7c1 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
@@ -30,6 +30,7 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.conf.adapter.CompressionRatio;
 import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
@@ -40,13 +41,18 @@ import org.apache.iotdb.db.exception.query.QueryProcessException;
 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.*;
+import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
+import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
+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.ShowPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.dataset.DeviceIterateDataSet;
 import org.apache.iotdb.db.query.dataset.ListDataSet;
+import org.apache.iotdb.db.query.dataset.SingleDataSet;
 import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.query.executor.IEngineQueryRouter;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
@@ -58,15 +64,6 @@ import org.apache.iotdb.tsfile.read.expression.QueryExpression;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Binary;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.apache.iotdb.db.conf.IoTDBConstant.STORAGE_GROUP;
-import static org.apache.iotdb.db.conf.IoTDBConstant.TTL;
-
 public abstract class AbstractQueryProcessExecutor implements IQueryProcessExecutor {
 
   IEngineQueryRouter queryRouter = new EngineQueryRouter();
@@ -93,6 +90,8 @@ public abstract class AbstractQueryProcessExecutor implements IQueryProcessExecu
         return processShowDynamicParameterQuery();
       case FLUSH_TASK_INFO:
         return processShowFlushTaskInfo();
+      case VERSION:
+        return processShowVersion();
       default:
         throw new QueryProcessException(String.format("Unrecognized show plan %s", showPlan));
     }
@@ -134,6 +133,20 @@ public abstract class AbstractQueryProcessExecutor implements IQueryProcessExecu
     return listDataSet;
   }
 
+  private QueryDataSet processShowVersion() {
+    List<Path> paths = new ArrayList<>();
+    List<TSDataType> dataTypes = new ArrayList<>();
+    paths.add(new Path("root"));
+    dataTypes.add(TSDataType.TEXT);
+    SingleDataSet singleDataSet = new SingleDataSet(paths, dataTypes);
+    Field field = new Field(TSDataType.TEXT);
+    field.setBinaryV(new Binary(IoTDBConstant.VERSION));
+    RowRecord rowRecord = new RowRecord(0);
+    rowRecord.addField(field);
+    singleDataSet.setRecord(rowRecord);
+    return singleDataSet;
+  }
+
   private QueryDataSet processShowDynamicParameterQuery() {
     List<Path> paths = new ArrayList<>();
     paths.add(new Path(PARAMETER));
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
index 5c2f9dd..2ca5862 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
@@ -49,7 +49,7 @@ public class ShowPlan extends PhysicalPlan {
   }
 
   public enum ShowContentType {
-    DYNAMIC_PARAMETER, FLUSH_TASK_INFO, TTL
+    DYNAMIC_PARAMETER, FLUSH_TASK_INFO, TTL, VERSION
   }
 
 }
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 273c4d1..582c042 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
@@ -120,6 +120,7 @@ import org.apache.iotdb.db.qp.strategy.SqlBaseParser.SetStorageGroupContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.SetTTLStatementContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.ShowAllTTLStatementContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.ShowTTLStatementContext;
+import org.apache.iotdb.db.qp.strategy.SqlBaseParser.ShowVersionContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.SlimitClauseContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.SoffsetClauseContext;
 import org.apache.iotdb.db.qp.strategy.SqlBaseParser.SuffixPathContext;
@@ -191,14 +192,14 @@ public class LogicalGenerator extends SqlBaseBaseListener {
   @Override
   public void enterMoveFile(MoveFileContext ctx) {
     super.enterMoveFile(ctx);
-    initializedOperator = new MoveFileOperator(new File(ctx.getChild(1).getText()),
-        new File(ctx.getChild(2).getText()));
+    initializedOperator = new MoveFileOperator(new File(ctx.FILE(0).getText()),
+        new File(ctx.FILE(1).getText()));
   }
 
   @Override
   public void enterRemoveFile(RemoveFileContext ctx) {
     super.enterRemoveFile(ctx);
-    initializedOperator = new RemoveFileOperator(new File(ctx.getChild(1).getText()));
+    initializedOperator = new RemoveFileOperator(new File(ctx.FILE().getText()));
   }
 
   @Override
@@ -208,6 +209,12 @@ public class LogicalGenerator extends SqlBaseBaseListener {
   }
 
   @Override
+  public void enterShowVersion(ShowVersionContext ctx) {
+    super.enterShowVersion(ctx);
+    initializedOperator = new ShowOperator(SQLConstant.TOK_VERSION);
+  }
+
+  @Override
   public void enterShowDynamicParameter(SqlBaseParser.ShowDynamicParameterContext ctx) {
     super.enterShowDynamicParameter(ctx);
     initializedOperator = new ShowOperator(SQLConstant.TOK_DYNAMIC_PARAMETER);
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 f62c3b2..077d256 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
@@ -168,6 +168,8 @@ public class PhysicalGenerator {
             return new ShowPlan(ShowContentType.DYNAMIC_PARAMETER);
           case SQLConstant.TOK_FLUSH_TASK_INFO:
             return new ShowPlan(ShowContentType.FLUSH_TASK_INFO);
+          case SQLConstant.TOK_VERSION:
+            return new ShowPlan(ShowContentType.VERSION);
           default:
             throw new LogicalOperatorException(String
                 .format("not supported operator type %s in show operation.", operator.getType()));
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java b/server/src/main/java/org/apache/iotdb/db/query/dataset/SingleDataSet.java
similarity index 56%
copy from server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
copy to server/src/main/java/org/apache/iotdb/db/query/dataset/SingleDataSet.java
index 5c2f9dd..e6e60d3 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/dataset/SingleDataSet.java
@@ -15,41 +15,38 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
  */
-package org.apache.iotdb.db.qp.physical.sys;
+package org.apache.iotdb.db.query.dataset;
 
+import java.io.IOException;
 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.file.metadata.enums.TSDataType;
 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 ShowPlan extends PhysicalPlan {
-
-  private ShowContentType showContentType;
+public class SingleDataSet extends QueryDataSet {
 
-  public ShowPlan(ShowContentType showContentType){
-    super(true);
-    this.showContentType = showContentType;
-    setOperatorType(OperatorType.SHOW);
-  }
+  private RowRecord record;
+  private int i = 0;
 
-  @Override
-  public List<Path> getPaths() {
-    return null;
+  public SingleDataSet(List<Path> paths,
+      List<TSDataType> dataTypes) {
+    super(paths, dataTypes);
   }
 
-  public ShowContentType getShowContentType() {
-    return showContentType;
+  public void setRecord(RowRecord record) {
+    this.record = record;
   }
 
   @Override
-  public String toString() {
-    return String.format("%s %s", getOperatorType().toString(), showContentType);
+  protected boolean hasNextWithoutConstraint() throws IOException {
+    return i == 0;
   }
 
-  public enum ShowContentType {
-    DYNAMIC_PARAMETER, FLUSH_TASK_INFO, TTL
+  @Override
+  protected RowRecord nextWithoutConstraint() throws IOException {
+    i++;
+    return record;
   }
-
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java b/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
index aaf70ed..267f915 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/EngineQueryRouter.java
@@ -24,7 +24,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import org.apache.iotdb.db.exception.StorageEngineException;
-import org.apache.iotdb.db.exception.path.PathException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.dataset.groupby.GroupByWithValueFilterDataSet;
@@ -40,7 +39,6 @@ import org.apache.iotdb.tsfile.read.expression.impl.BinaryExpression;
 import org.apache.iotdb.tsfile.read.expression.impl.GlobalTimeExpression;
 import org.apache.iotdb.tsfile.read.expression.util.ExpressionOptimizer;
 import org.apache.iotdb.tsfile.read.filter.GroupByFilter;
-import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterType;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Pair;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/FillEngineExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/FillEngineExecutor.java
index 00bbe8e..315d0a4 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/FillEngineExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/FillEngineExecutor.java
@@ -24,7 +24,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import org.apache.iotdb.db.exception.StorageEngineException;
-import org.apache.iotdb.db.exception.path.PathException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.query.context.QueryContext;
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 af471db..c6ea279 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
@@ -378,10 +378,6 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
               getNodeTimeseriesNum(getNodesList(req.getColumnPath(), req.getNodeLevel())));
           status = getStatus(TSStatusCode.SUCCESS_STATUS);
           break;
-        case "VERSION":
-          resp.setVersion(getVersion());
-          status = getStatus(TSStatusCode.SUCCESS_STATUS);
-          break;
         default:
           status = getStatus(TSStatusCode.METADATA_ERROR, req.getType());
           break;
@@ -422,10 +418,6 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     return MManager.getInstance().getChildNodePathInNextLevel(path);
   }
 
-  private String getVersion() throws SQLException {
-    return IoTDBConstant.VERSION;
-  }
-
   private List<List<String>> getTimeSeriesForPath(String path)
       throws PathException {
     return MManager.getInstance().getShowTimeseriesPath(path);
@@ -669,6 +661,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
         return executeShowFlushTaskInfo();
       case DYNAMIC_PARAMETER:
         return executeShowDynamicParameter();
+      case VERSION:
+        return executeShowVersion();
       default:
         logger.error("Unsupported show content type: {}", showPlan.getShowContentType());
         throw new Exception("Unsupported show content type:" + showPlan.getShowContentType());
@@ -720,6 +714,19 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     return resp;
   }
 
+  private TSExecuteStatementResp executeShowVersion() {
+    TSExecuteStatementResp resp =
+        getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS));
+    resp.setIgnoreTimeStamp(true);
+    List<String> columns = new ArrayList<>();
+    List<String> columnTypes = new ArrayList<>();
+    columns.add("version        ");
+    columnTypes.add(TSDataType.TEXT.toString());
+    resp.setColumns(columns);
+    resp.setDataTypeList(columnTypes);
+    return resp;
+  }
+
   private TSExecuteStatementResp getAuthQueryColumnHeaders(PhysicalPlan plan) {
     TSExecuteStatementResp resp = getTSExecuteStatementResp(getStatus(TSStatusCode.SUCCESS_STATUS));
     resp.setIgnoreTimeStamp(true);
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
index 0c4203c..1c93693 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
@@ -208,8 +208,8 @@ public class IoTDBMetadataFetchIT {
         boolean hasResultSet = statement.execute(sql);
         if(hasResultSet) {
           try(ResultSet resultSet = statement.getResultSet()) {
-            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
-            Assert.assertEquals(resultSetMetaData.getColumnLabel(1), IoTDBConstant.VERSION);
+            resultSet.next();
+            Assert.assertEquals(resultSet.getString(2), IoTDBConstant.VERSION);
           }
         }
       } catch (Exception e) {
diff --git a/service-rpc/rpc-changelist.md b/service-rpc/rpc-changelist.md
index 43c8a75..4e722f8 100644
--- a/service-rpc/rpc-changelist.md
+++ b/service-rpc/rpc-changelist.md
@@ -32,6 +32,7 @@ Last Updated on October 27th, 2019 by Lei Rui.
 | Delete struct TSSetStorageGroupReq | Jialin Qiao        |
 | Remove struct TSDataValue          | Lei Rui            |
 | Remove struct TSRowRecord          | Lei Rui            |
+| Remove optional string version in TSFetchMetadataResp | Genius_pig |
 
 
 
diff --git a/service-rpc/src/main/thrift/rpc.thrift b/service-rpc/src/main/thrift/rpc.thrift
index 4384309..d7a123d 100644
--- a/service-rpc/src/main/thrift/rpc.thrift
+++ b/service-rpc/src/main/thrift/rpc.thrift
@@ -198,7 +198,6 @@ struct TSFetchMetadataResp{
 		9: optional list<string> nodesList
 		10: optional map<string, string> nodeTimeseriesNum
 		11: optional set<string> childPaths
-		12: optional string version
 }
 
 struct TSFetchMetadataReq{