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 2020/03/08 10:46:46 UTC

[incubator-iotdb] 01/01: fix exception organization

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

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

commit c01e57e847315c3d183f304bb054e2cb713da288
Author: qiaojialin <64...@qq.com>
AuthorDate: Sun Mar 8 18:46:21 2020 +0800

    fix exception organization
---
 .../apache/iotdb/rocketmq/RocketMQConsumer.java    |  22 ++--
 .../main/java/org/apache/iotdb/SessionExample.java |  26 ++--
 .../apache/iotdb/jdbc/AbstractIoTDBResultSet.java  |   6 +-
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |   9 +-
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   |   4 +-
 .../iotdb/jdbc/IoTDBNonAlignQueryResultSet.java    |   4 +-
 .../org/apache/iotdb/jdbc/IoTDBQueryResultSet.java |   4 +-
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |   8 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  80 ++++++------
 .../iotdb/db/integration/IOTDBGroupByIT.java       |  22 ++--
 ...xception.java => IoTDBConnectionException.java} |  11 +-
 .../main/java/org/apache/iotdb/rpc/RpcUtils.java   |   6 +-
 .../iotdb/rpc/StatementExecutionException.java     |  20 ++-
 .../java/org/apache/iotdb/session/Session.java     | 140 ++++++++++++---------
 .../org/apache/iotdb/session/SessionDataSet.java   |  16 ++-
 .../org/apache/iotdb/session/IoTDBSessionIT.java   |  68 +++++-----
 16 files changed, 238 insertions(+), 208 deletions(-)

diff --git a/example/rocketmq/src/main/java/org/apache/iotdb/rocketmq/RocketMQConsumer.java b/example/rocketmq/src/main/java/org/apache/iotdb/rocketmq/RocketMQConsumer.java
index 72ac2ad..382cb71 100644
--- a/example/rocketmq/src/main/java/org/apache/iotdb/rocketmq/RocketMQConsumer.java
+++ b/example/rocketmq/src/main/java/org/apache/iotdb/rocketmq/RocketMQConsumer.java
@@ -18,16 +18,14 @@
  */
 package org.apache.iotdb.rocketmq;
 
-import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.List;
-
+import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.session.IoTDBSessionException;
 import org.apache.iotdb.session.Session;
 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.rocketmq.client.consumer.DefaultMQPushConsumer;
 import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
 import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
@@ -46,7 +44,8 @@ public class RocketMQConsumer {
   private static final Logger logger = LoggerFactory.getLogger(RocketMQConsumer.class);
 
   public RocketMQConsumer(String producerGroup, String serverAddresses, String connectionHost,
-      int connectionPort, String user, String password) throws ClassNotFoundException, SQLException, IoTDBSessionException {
+      int connectionPort, String user, String password)
+      throws IoTDBConnectionException, IoTDBSessionException {
     this.producerGroup = producerGroup;
     this.serverAddresses = serverAddresses;
     this.consumer = new DefaultMQPushConsumer(producerGroup);
@@ -55,7 +54,7 @@ public class RocketMQConsumer {
   }
 
   private void initIoTDB(String host, int port, String user, String password)
-      throws SQLException, IoTDBSessionException {
+      throws IoTDBConnectionException, IoTDBSessionException {
     if (host == null) {
       host = Constant.IOTDB_CONNECTION_HOST;
       port = Constant.IOTDB_CONNECTION_PORT;
@@ -72,11 +71,12 @@ public class RocketMQConsumer {
     }
   }
   
-  private void addStorageGroup(String storageGroup) throws IoTDBSessionException {
+  private void addStorageGroup(String storageGroup)
+      throws IoTDBSessionException, IoTDBConnectionException {
     session.setStorageGroup(storageGroup);
   }
   
-  private void createTimeseries(String[] sql) throws IoTDBSessionException {
+  private void createTimeseries(String[] sql) throws IoTDBSessionException, IoTDBConnectionException {
     String timeseries = sql[0];
     TSDataType dataType = TSDataType.valueOf(sql[1]);
     TSEncoding encoding = TSEncoding.valueOf(sql[2]);
@@ -84,7 +84,7 @@ public class RocketMQConsumer {
     session.createTimeseries(timeseries, dataType, encoding, compressionType);
   }
   
-  private void insert(String data) throws IoTDBSessionException {
+  private void insert(String data) throws IoTDBConnectionException {
     String[] dataArray = data.split(",");
     String device = dataArray[0];
     long time = Long.parseLong(dataArray[1]);
@@ -101,7 +101,7 @@ public class RocketMQConsumer {
    * Subscribe topic and add regiser Listener
    * @throws MQClientException
    */
-  public void prepareConsume() throws MQClientException, IoTDBSessionException {
+  public void prepareConsume() throws MQClientException {
     /**
      * Subscribe one more more topics to consume.
      */
@@ -120,7 +120,7 @@ public class RocketMQConsumer {
             new String(msg.getBody())));
         try {
           insert(new String(msg.getBody()));
-        } catch (IoTDBSessionException e) {
+        } catch (IoTDBConnectionException e) {
           logger.error(e.getMessage());
         }
       }
@@ -149,7 +149,7 @@ public class RocketMQConsumer {
   }
 
   public static void main(String[] args)
-      throws MQClientException, SQLException, ClassNotFoundException, IoTDBSessionException {
+      throws MQClientException, IoTDBSessionException, IoTDBConnectionException {
     /**
      *Instantiate with specified consumer group name and specify name server addresses.
      */
diff --git a/example/session/src/main/java/org/apache/iotdb/SessionExample.java b/example/session/src/main/java/org/apache/iotdb/SessionExample.java
index 58ab4ef..1b40b41 100644
--- a/example/session/src/main/java/org/apache/iotdb/SessionExample.java
+++ b/example/session/src/main/java/org/apache/iotdb/SessionExample.java
@@ -18,8 +18,8 @@
  */
 package org.apache.iotdb;
 
-import org.apache.iotdb.rpc.IoTDBRPCException;
-import org.apache.iotdb.session.IoTDBSessionException;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.session.Session;
 import org.apache.iotdb.session.SessionDataSet;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -28,9 +28,6 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.write.record.RowBatch;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.apache.iotdb.tsfile.write.schema.Schema;
-import org.apache.thrift.TException;
-
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -39,7 +36,7 @@ public class SessionExample {
   private static Session session;
 
   public static void main(String[] args)
-          throws IoTDBSessionException, TException, IoTDBRPCException, SQLException {
+      throws IoTDBConnectionException, StatementExecutionException {
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
 
@@ -64,7 +61,7 @@ public class SessionExample {
     session.close();
   }
 
-  private static void insert() throws IoTDBSessionException {
+  private static void insert() throws IoTDBConnectionException {
     String deviceId = "root.sg1.d1";
     List<String> measurements = new ArrayList<>();
     measurements.add("s1");
@@ -79,7 +76,7 @@ public class SessionExample {
     }
   }
 
-  private static void insertInBatch() throws IoTDBSessionException {
+  private static void insertInBatch() throws IoTDBConnectionException {
     String deviceId = "root.sg1.d1";
     List<String> measurements = new ArrayList<>();
     measurements.add("s1");
@@ -126,7 +123,7 @@ public class SessionExample {
    * Users need to control the count of RowBatch and write a batch when it reaches the maxBatchSize
    *
    */
-  private static void insertRowBatch() throws IoTDBSessionException {
+  private static void insertRowBatch() throws IoTDBConnectionException {
     // The schema of sensors of one device
     Schema schema = new Schema();
     schema.registerMeasurement(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE));
@@ -157,13 +154,13 @@ public class SessionExample {
     }
   }
 
-  private static void deleteData() throws IoTDBSessionException {
+  private static void deleteData() throws IoTDBConnectionException {
     String path = "root.sg1.d1.s1";
     long deleteTime = 99;
     session.deleteData(path, deleteTime);
   }
 
-  private static void deleteTimeseries() throws IoTDBSessionException {
+  private static void deleteTimeseries() throws IoTDBConnectionException {
     List<String> paths = new ArrayList<>();
     paths.add("root.sg1.d1.s1");
     paths.add("root.sg1.d1.s2");
@@ -171,8 +168,9 @@ public class SessionExample {
     session.deleteTimeseries(paths);
   }
 
-  private static void query() throws TException, IoTDBRPCException, SQLException {
-    SessionDataSet dataSet = session.executeQueryStatement("select * from root.sg1.d1");
+  private static void query() throws IoTDBConnectionException, StatementExecutionException {
+    SessionDataSet dataSet;
+    dataSet = session.executeQueryStatement("select * from root.sg1.d1");
     dataSet.setBatchSize(1024); // default is 512
     while (dataSet.hasNext()){
       System.out.println(dataSet.next());
@@ -181,7 +179,7 @@ public class SessionExample {
     dataSet.closeOperationHandle();
   }
 
-  private static void nonQuery() throws TException, IoTDBRPCException, SQLException {
+  private static void nonQuery() throws IoTDBConnectionException, StatementExecutionException {
     session.executeNonQueryStatement("insert into root.sg1.d1(timestamp,s1) values(200, 1);");
   }
 }
\ No newline at end of file
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBResultSet.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBResultSet.java
index b1c9e0e..611f141 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBResultSet.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.jdbc;
 
-import org.apache.iotdb.rpc.IoTDBRPCException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.TSCloseOperationReq;
 import org.apache.iotdb.service.rpc.thrift.TSIService;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
@@ -144,8 +144,8 @@ public abstract class AbstractIoTDBResultSet implements ResultSet {
         closeReq.setQueryId(queryId);
         TSStatus closeResp = client.closeOperation(closeReq);
         RpcUtils.verifySuccess(closeResp);
-      } catch (IoTDBRPCException e) {
-        throw new SQLException("Error occurs for close opeation in server side becasuse ", e);
+      } catch (StatementExecutionException e) {
+        throw new SQLException("Error occurs for close operation in server side because ", e);
       } catch (TException e) {
         throw new SQLException("Error occurs when connecting to server for close operation ", e);
       }
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
index 4afaf45..0f5982c 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
@@ -38,8 +38,9 @@ import java.time.ZoneId;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.Executor;
-import org.apache.iotdb.rpc.IoTDBRPCException;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.*;
 import org.apache.thrift.TException;
 import org.apache.thrift.protocol.TBinaryProtocol;
@@ -448,7 +449,7 @@ public class IoTDBConnection implements Connection {
       }
       throw new SQLException(String.format("Can not establish connection with %s : %s. ",
           params.getJdbcUriString(), e.getMessage()), e);
-    } catch (IoTDBRPCException e) {
+    } catch (StatementExecutionException e) {
       // failed to connect, disconnect from the server
       transport.close();
       throw new IoTDBSQLException(e.getMessage(), openResp.getStatus());
@@ -493,7 +494,7 @@ public class IoTDBConnection implements Connection {
     TSGetTimeZoneResp resp = getClient().getTimeZone(sessionId);
     try {
       RpcUtils.verifySuccess(resp.getStatus());
-    } catch (IoTDBRPCException e) {
+    } catch (StatementExecutionException e) {
       throw new IoTDBSQLException(e.getMessage(), resp.getStatus());
     }
     return resp.getTimeZone();
@@ -504,7 +505,7 @@ public class IoTDBConnection implements Connection {
     TSStatus resp = getClient().setTimeZone(req);
     try {
       RpcUtils.verifySuccess(resp);
-    } catch (IoTDBRPCException e) {
+    } catch (StatementExecutionException e) {
       throw new IoTDBSQLException(e.getMessage(), resp);
     }
     this.zoneId = ZoneId.of(zoneId);
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 1ecac2a..33ec2bb 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
@@ -19,8 +19,8 @@
 package org.apache.iotdb.jdbc;
 
 import java.sql.*;
-import org.apache.iotdb.rpc.IoTDBRPCException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.TSFetchMetadataReq;
 import org.apache.iotdb.service.rpc.thrift.TSFetchMetadataResp;
 import org.apache.iotdb.service.rpc.thrift.TSIService;
@@ -1013,7 +1013,7 @@ public class IoTDBDatabaseMetadata implements DatabaseMetaData {
     resp = client.fetchMetadata(req);
     try {
       RpcUtils.verifySuccess(resp.getStatus());
-    } catch (IoTDBRPCException e) {
+    } catch (StatementExecutionException e) {
       throw new IoTDBSQLException(e.getMessage(), resp.getStatus());
     }
     return resp.getMetadataInJson();
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignQueryResultSet.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignQueryResultSet.java
index 8d3cb7d..23f65ca 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignQueryResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignQueryResultSet.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.jdbc;
 
-import org.apache.iotdb.rpc.IoTDBRPCException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.TSFetchResultsReq;
 import org.apache.iotdb.service.rpc.thrift.TSFetchResultsResp;
 import org.apache.iotdb.service.rpc.thrift.TSIService;
@@ -101,7 +101,7 @@ public class IoTDBNonAlignQueryResultSet extends AbstractIoTDBResultSet {
 
       try {
         RpcUtils.verifySuccess(resp.getStatus());
-      } catch (IoTDBRPCException e) {
+      } catch (StatementExecutionException e) {
         throw new IoTDBSQLException(e.getMessage(), resp.getStatus());
       }
       if (!resp.hasResultSet) {
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBQueryResultSet.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBQueryResultSet.java
index d0f466e..173c9a5 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBQueryResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBQueryResultSet.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.jdbc;
 
-import org.apache.iotdb.rpc.IoTDBRPCException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.TSFetchResultsReq;
 import org.apache.iotdb.service.rpc.thrift.TSFetchResultsResp;
 import org.apache.iotdb.service.rpc.thrift.TSIService;
@@ -83,7 +83,7 @@ public class IoTDBQueryResultSet extends AbstractIoTDBResultSet {
 
       try {
         RpcUtils.verifySuccess(resp.getStatus());
-      } catch (IoTDBRPCException e) {
+      } catch (StatementExecutionException e) {
         throw new IoTDBSQLException(e.getMessage(), resp.getStatus());
       }
       if (!resp.hasResultSet) {
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 cacc7fd..9ea181e 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.jdbc;
 
-import org.apache.iotdb.rpc.IoTDBRPCException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.*;
 import org.apache.thrift.TException;
@@ -217,7 +217,7 @@ public class IoTDBStatement implements Statement {
     TSExecuteStatementResp execResp = client.executeStatement(execReq);
     try {
       RpcUtils.verifySuccess(execResp.getStatus());
-    } catch (IoTDBRPCException e) {
+    } catch (StatementExecutionException e) {
       throw new IoTDBSQLException(e.getMessage(), execResp.getStatus());
     }
     if (execResp.isSetColumns()) {
@@ -325,7 +325,7 @@ public class IoTDBStatement implements Statement {
     queryId = execResp.getQueryId();
     try {
       RpcUtils.verifySuccess(execResp.getStatus());
-    } catch (IoTDBRPCException e) {
+    } catch (StatementExecutionException e) {
       throw new IoTDBSQLException(e.getMessage(), execResp.getStatus());
     }
     if (execResp.queryDataSet == null) {
@@ -387,7 +387,7 @@ public class IoTDBStatement implements Statement {
     }
     try {
       RpcUtils.verifySuccess(execResp.getStatus());
-    } catch (IoTDBRPCException e) {
+    } catch (StatementExecutionException e) {
       throw new IoTDBSQLException(e.getMessage(), execResp.getStatus());
     }
     return 0;
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 c7f892b..fcc6ede 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
@@ -578,6 +578,49 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     }
   }
 
+  @Override
+  public TSExecuteStatementResp executeQueryStatement(TSExecuteStatementReq req) {
+    try {
+      long startTime = System.currentTimeMillis();
+      TSExecuteStatementResp resp;
+      SqlArgument sqlArgument;
+
+      if (!checkLogin(req.getSessionId())) {
+        logger.info(INFO_NOT_LOGIN, IoTDBConstant.GLOBAL_DB_NAME);
+        return getTSExecuteStatementResp(getStatus(TSStatusCode.NOT_LOGIN_ERROR));
+      }
+
+      String statement = req.getStatement();
+      PhysicalPlan physicalPlan;
+      try {
+        physicalPlan =
+            processor.parseSQLToPhysicalPlan(statement, sessionIdZoneIdMap.get(req.getSessionId()));
+      } catch (QueryProcessException | SQLParserException e) {
+        logger.info(ERROR_PARSING_SQL, e.getMessage());
+        return getTSExecuteStatementResp(getStatus(TSStatusCode.SQL_PARSE_ERROR, e.getMessage()));
+      }
+
+      if (!physicalPlan.isQuery()) {
+        return getTSExecuteStatementResp(
+            getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, "Statement is not a query statement."));
+      }
+
+      resp = internalExecuteQueryStatement(
+          req.statementId, physicalPlan, req.fetchSize,
+          sessionIdUsernameMap.get(req.getSessionId()));
+      long endTime = System.currentTimeMillis();
+      sqlArgument = new SqlArgument(resp, physicalPlan, statement, startTime, endTime);
+      sqlArgumentsList.add(sqlArgument);
+      if (sqlArgumentsList.size() > MAX_SIZE) {
+        sqlArgumentsList.subList(0, DELETE_SIZE).clear();
+      }
+      return resp;
+    } catch (ParseCancellationException e) {
+      logger.debug(e.getMessage());
+      return getTSExecuteStatementResp(getStatus(TSStatusCode.SQL_PARSE_ERROR, e.getMessage()));
+    }
+  }
+
   /**
    * @param plan must be a plan for Query: FillQueryPlan, AggregationPlan, GroupByPlan, some
    *             AuthorPlan
@@ -640,43 +683,6 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     }
   }
 
-  @Override
-  public TSExecuteStatementResp executeQueryStatement(TSExecuteStatementReq req) {
-    long startTime = System.currentTimeMillis();
-    TSExecuteStatementResp resp;
-    SqlArgument sqlArgument;
-
-    if (!checkLogin(req.getSessionId())) {
-      logger.info(INFO_NOT_LOGIN, IoTDBConstant.GLOBAL_DB_NAME);
-      return getTSExecuteStatementResp(getStatus(TSStatusCode.NOT_LOGIN_ERROR));
-    }
-
-    String statement = req.getStatement();
-    PhysicalPlan physicalPlan;
-    try {
-      physicalPlan =
-          processor.parseSQLToPhysicalPlan(statement, sessionIdZoneIdMap.get(req.getSessionId()));
-    } catch (QueryProcessException | SQLParserException e) {
-      logger.info(ERROR_PARSING_SQL, e.getMessage());
-      return getTSExecuteStatementResp(getStatus(TSStatusCode.SQL_PARSE_ERROR, e.getMessage()));
-    }
-
-    if (!physicalPlan.isQuery()) {
-      return getTSExecuteStatementResp(
-          getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, "Statement is not a query statement."));
-    }
-
-    resp = internalExecuteQueryStatement(
-        req.statementId, physicalPlan, req.fetchSize, sessionIdUsernameMap.get(req.getSessionId()));
-    long endTime = System.currentTimeMillis();
-    sqlArgument = new SqlArgument(resp, physicalPlan, statement, startTime, endTime);
-    sqlArgumentsList.add(sqlArgument);
-    if (sqlArgumentsList.size() > MAX_SIZE) {
-      sqlArgumentsList.subList(0, DELETE_SIZE).clear();
-    }
-    return resp;
-  }
-
   private TSExecuteStatementResp getShowQueryColumnHeaders(ShowPlan showPlan)
       throws QueryProcessException {
     switch (showPlan.getShowContentType()) {
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
index 8391931..4877022 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
@@ -509,12 +509,12 @@ public class IOTDBGroupByIT {
   @Test
   public void countSumAvgNoDataTest() {
     String[] retArray1 = new String[]{
-        ",0,0.0,null",
-        ",0,0.0,null",
-        ",0,0.0,null",
-        ",0,0.0,null",
-        ",0,0.0,null",
-        ",0,0.0,null",
+        "10000,0,0.0,null",
+        "10005,0,0.0,null",
+        "10010,0,0.0,null",
+        "10015,0,0.0,null",
+        "10020,0,0.0,null",
+        "10025,0,0.0,null",
     };
 
     try (Connection connection = DriverManager.
@@ -523,17 +523,17 @@ public class IOTDBGroupByIT {
       boolean hasResultSet = statement.execute(
           "select count(temperature), sum(temperature), avg(temperature) from "
               + "root.ln.wf01.wt01 where temperature > 3 "
-              + "GROUP BY ([NOW()-30ms, NOW()), 5ms)");
+              + "GROUP BY ([10000, 10030), 5ms)");
 
       Assert.assertTrue(hasResultSet);
       int cnt;
       try (ResultSet resultSet = statement.getResultSet()) {
         cnt = 0;
         while (resultSet.next()) {
-          String ans = "," + resultSet
-              .getString(count("root.ln.wf01.wt01.temperature")) + "," +
-              resultSet.getString(sum("root.ln.wf01.wt01.temperature")) + "," + resultSet
-              .getString(avg("root.ln.wf01.wt01.temperature"));
+          String ans = resultSet.getString("Time") + "," +
+              resultSet.getString(count("root.ln.wf01.wt01.temperature")) + "," +
+              resultSet.getString(sum("root.ln.wf01.wt01.temperature")) + "," +
+              resultSet.getString(avg("root.ln.wf01.wt01.temperature"));
           Assert.assertEquals(retArray1[cnt], ans);
           cnt++;
         }
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRPCException.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBConnectionException.java
similarity index 76%
rename from service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRPCException.java
rename to service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBConnectionException.java
index 9e326db..90272ad 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRPCException.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBConnectionException.java
@@ -18,12 +18,19 @@
  */
 package org.apache.iotdb.rpc;
 
-public class IoTDBRPCException extends Exception{
+public class IoTDBConnectionException extends Exception{
 
   private static final long serialVersionUID = -1268775292265203036L;
 
-  public IoTDBRPCException(String reason) {
+  public IoTDBConnectionException(String reason) {
     super(reason);
   }
 
+  public IoTDBConnectionException(Throwable cause) {
+    super(cause);
+  }
+
+  public IoTDBConnectionException(String message, Throwable cause) {
+    super(message, cause);
+  }
 }
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
index dbae831..8b2e956 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
@@ -34,9 +34,11 @@ public class RpcUtils {
    *
    * @param status -status
    */
-  public static void verifySuccess(TSStatus status) throws IoTDBRPCException {
+  public static void verifySuccess(TSStatus status) throws StatementExecutionException {
     if (status.getStatusType().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-      throw new IoTDBRPCException(String.format("%d: %s", status.getStatusType().getCode(), status.getStatusType().getMessage()));
+      throw new StatementExecutionException(String.format("%d: %s",
+          status.getStatusType().getCode(),
+          status.getStatusType().getMessage()));
     }
   }
 
diff --git a/session/src/main/java/org/apache/iotdb/session/IoTDBSessionException.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/StatementExecutionException.java
similarity index 68%
rename from session/src/main/java/org/apache/iotdb/session/IoTDBSessionException.java
rename to service-rpc/src/main/java/org/apache/iotdb/rpc/StatementExecutionException.java
index 12a2ee7..d7e09fc 100644
--- a/session/src/main/java/org/apache/iotdb/session/IoTDBSessionException.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/StatementExecutionException.java
@@ -7,7 +7,7 @@
  * "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
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,21 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.session;
+package org.apache.iotdb.rpc;
 
-public class IoTDBSessionException extends Exception {
+public class StatementExecutionException extends Exception{
 
-  private static final long serialVersionUID = 2405104784097667293L;
-
-  public IoTDBSessionException(String msg) {
-    super(msg);
+  public StatementExecutionException(String reason) {
+    super(reason);
   }
 
-  public IoTDBSessionException(String message, Throwable cause) {
-    super(message, cause);
+  public StatementExecutionException(Throwable cause) {
+    super(cause);
   }
 
-  public IoTDBSessionException(Throwable cause) {
-    super(cause);
+  public StatementExecutionException(String message, Throwable cause) {
+    super(message, cause);
   }
 }
diff --git a/session/src/main/java/org/apache/iotdb/session/Session.java b/session/src/main/java/org/apache/iotdb/session/Session.java
index 769281f..3b5ba5b 100644
--- a/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -26,8 +26,9 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import org.apache.iotdb.rpc.IoTDBRPCException;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.TSBatchInsertionReq;
 import org.apache.iotdb.service.rpc.thrift.TSCloseSessionReq;
@@ -100,12 +101,12 @@ public class Session {
     this.fetchSize = fetchSize;
   }
 
-  public synchronized void open() throws IoTDBSessionException {
+  public synchronized void open() throws IoTDBConnectionException {
     open(false, Config.DEFAULT_TIMEOUT_MS);
   }
 
   private synchronized void open(boolean enableRPCCompression, int connectionTimeoutInMs)
-      throws IoTDBSessionException {
+      throws IoTDBConnectionException {
     if (!isClosed) {
       return;
     }
@@ -114,7 +115,7 @@ public class Session {
       try {
         transport.open();
       } catch (TTransportException e) {
-        throw new IoTDBSessionException(e);
+        throw new IoTDBConnectionException(e);
       }
     }
 
@@ -153,10 +154,9 @@ public class Session {
         zoneId = ZoneId.of(getTimeZone());
       }
 
-    } catch (TException | IoTDBRPCException e) {
+    } catch (Exception e) {
       transport.close();
-      throw new IoTDBSessionException(String.format("Can not open session to %s:%s with user: %s.",
-          host, port, username), e);
+      throw new IoTDBConnectionException(e);
     }
     isClosed = false;
 
@@ -164,7 +164,7 @@ public class Session {
 
   }
 
-  public synchronized void close() throws IoTDBSessionException {
+  public synchronized void close() throws IoTDBConnectionException {
     if (isClosed) {
       return;
     }
@@ -172,7 +172,7 @@ public class Session {
     try {
       client.closeSession(req);
     } catch (TException e) {
-      throw new IoTDBSessionException(
+      throw new IoTDBConnectionException(
           "Error occurs when closing session at server. Maybe server is down.", e);
     } finally {
       isClosed = true;
@@ -201,7 +201,8 @@ public class Session {
    *
    * @param rowBatch data batch
    */
-  private TSExecuteBatchStatementResp insertSortedBatchIntern(RowBatch rowBatch) throws IoTDBSessionException{
+  private TSExecuteBatchStatementResp insertSortedBatchIntern(RowBatch rowBatch)
+      throws IoTDBConnectionException {
     TSBatchInsertionReq request = new TSBatchInsertionReq();
     request.setSessionId(sessionId);
     request.deviceId = rowBatch.deviceId;
@@ -216,7 +217,7 @@ public class Session {
     try {
       return checkAndReturn(client.insertBatch(request));
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -227,9 +228,9 @@ public class Session {
    * @param rowBatch data batch
    */
   public TSExecuteBatchStatementResp insertSortedBatch(RowBatch rowBatch)
-      throws IoTDBSessionException {
+      throws StatementExecutionException, IoTDBConnectionException {
     if(!checkSorted(rowBatch)){
-      throw new IoTDBSessionException("Row batch has't been sorted when calling insertSortedBatch");
+      throw new StatementExecutionException("Row batch has't been sorted when calling insertSortedBatch");
     }
     return insertSortedBatchIntern(rowBatch);
   }
@@ -239,8 +240,8 @@ public class Session {
    *
    * @param rowBatch data batch
    */
-  public TSExecuteBatchStatementResp insertBatch(RowBatch rowBatch)
-      throws IoTDBSessionException {
+  public TSExecuteBatchStatementResp insertBatch(RowBatch rowBatch) throws IoTDBConnectionException {
+
     sortRowBatch(rowBatch);
 
     return insertSortedBatchIntern(rowBatch);
@@ -329,9 +330,8 @@ public class Session {
    * @see Session#insertBatch(RowBatch)
    */
   public List<TSStatus> insertInBatch(List<String> deviceIds, List<Long> times,
-      List<List<String>> measurementsList,
-      List<List<String>> valuesList)
-      throws IoTDBSessionException {
+      List<List<String>> measurementsList, List<List<String>> valuesList)
+      throws IoTDBConnectionException {
     // check params size
     int len = deviceIds.size();
     if (len != times.size() || len != measurementsList.size() || len != valuesList.size()) {
@@ -353,7 +353,7 @@ public class Session {
       }
       return result;
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -365,8 +365,7 @@ public class Session {
    * @see Session#insertBatch(RowBatch)
    */
   public TSStatus insert(String deviceId, long time, List<String> measurements,
-      List<String> values)
-      throws IoTDBSessionException {
+      List<String> values) throws IoTDBConnectionException {
     TSInsertReq request = new TSInsertReq();
     request.setSessionId(sessionId);
     request.setDeviceId(deviceId);
@@ -377,7 +376,7 @@ public class Session {
     try {
       return checkAndReturn(client.insert(request));
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -386,7 +385,7 @@ public class Session {
    * this method should be used to test other time cost in client
    */
   public TSExecuteBatchStatementResp testInsertBatch(RowBatch rowBatch)
-      throws IoTDBSessionException {
+      throws IoTDBConnectionException {
     TSBatchInsertionReq request = new TSBatchInsertionReq();
     request.setSessionId(sessionId);
     request.deviceId = rowBatch.deviceId;
@@ -401,7 +400,7 @@ public class Session {
     try {
       return client.testInsertBatch(request);
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -410,9 +409,8 @@ public class Session {
    * this method should be used to test other time cost in client
    */
   public List<TSStatus> testInsertInBatch(List<String> deviceIds, List<Long> times,
-      List<List<String>> measurementsList,
-      List<List<String>> valuesList)
-      throws IoTDBSessionException {
+      List<List<String>> measurementsList, List<List<String>> valuesList)
+      throws IoTDBConnectionException {
     // check params size
     int len = deviceIds.size();
     if (len != times.size() || len != measurementsList.size() || len != valuesList.size()) {
@@ -431,7 +429,7 @@ public class Session {
       client.testInsertRowInBatch(request);
       return Collections.emptyList();
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -440,8 +438,7 @@ public class Session {
    * this method should be used to test other time cost in client
    */
   public TSStatus testInsert(String deviceId, long time, List<String> measurements,
-      List<String> values)
-      throws IoTDBSessionException {
+      List<String> values) throws IoTDBConnectionException {
     TSInsertReq request = new TSInsertReq();
     request.setSessionId(sessionId);
     request.setDeviceId(deviceId);
@@ -452,7 +449,7 @@ public class Session {
     try {
       return client.testInsertRow(request);
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -461,7 +458,7 @@ public class Session {
    *
    * @param path timeseries to delete, should be a whole path
    */
-  public TSStatus deleteTimeseries(String path) throws IoTDBSessionException {
+  public TSStatus deleteTimeseries(String path) throws IoTDBConnectionException {
     List<String> paths = new ArrayList<>();
     paths.add(path);
     return deleteTimeseries(paths);
@@ -472,11 +469,11 @@ public class Session {
    *
    * @param paths timeseries to delete, should be a whole path
    */
-  public TSStatus deleteTimeseries(List<String> paths) throws IoTDBSessionException {
+  public TSStatus deleteTimeseries(List<String> paths) throws IoTDBConnectionException {
     try {
       return checkAndReturn(client.deleteTimeseries(sessionId, paths));
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -486,7 +483,7 @@ public class Session {
    * @param path data in which time series to delete
    * @param time data with time stamp less than or equal to time will be deleted
    */
-  public TSStatus deleteData(String path, long time) throws IoTDBSessionException {
+  public TSStatus deleteData(String path, long time) throws IoTDBConnectionException {
     List<String> paths = new ArrayList<>();
     paths.add(path);
     return deleteData(paths, time);
@@ -498,8 +495,7 @@ public class Session {
    * @param paths data in which time series to delete
    * @param time  data with time stamp less than or equal to time will be deleted
    */
-  public TSStatus deleteData(List<String> paths, long time)
-      throws IoTDBSessionException {
+  public TSStatus deleteData(List<String> paths, long time) throws IoTDBConnectionException {
     TSDeleteDataReq request = new TSDeleteDataReq();
     request.setSessionId(sessionId);
     request.setPaths(paths);
@@ -508,38 +504,38 @@ public class Session {
     try {
       return checkAndReturn(client.deleteData(request));
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
-  public TSStatus setStorageGroup(String storageGroupId) throws IoTDBSessionException {
+  public TSStatus setStorageGroup(String storageGroupId)
+      throws IoTDBConnectionException, StatementExecutionException {
     checkPathValidity(storageGroupId);
     try {
       return checkAndReturn(client.setStorageGroup(sessionId, storageGroupId));
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
 
-  public TSStatus deleteStorageGroup(String storageGroup)
-      throws IoTDBSessionException {
+  public TSStatus deleteStorageGroup(String storageGroup) throws IoTDBConnectionException {
     List<String> groups = new ArrayList<>();
     groups.add(storageGroup);
     return deleteStorageGroups(groups);
   }
 
-  public TSStatus deleteStorageGroups(List<String> storageGroup)
-      throws IoTDBSessionException {
+  public TSStatus deleteStorageGroups(List<String> storageGroup) throws IoTDBConnectionException {
     try {
       return checkAndReturn(client.deleteStorageGroups(sessionId, storageGroup));
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
   public TSStatus createTimeseries(String path, TSDataType dataType,
-      TSEncoding encoding, CompressionType compressor) throws IoTDBSessionException {
+      TSEncoding encoding, CompressionType compressor)
+      throws IoTDBConnectionException, StatementExecutionException {
     checkPathValidity(path);
     TSCreateTimeseriesReq request = new TSCreateTimeseriesReq();
     request.setSessionId(sessionId);
@@ -551,16 +547,17 @@ public class Session {
     try {
       return checkAndReturn(client.createTimeseries(request));
     } catch (TException e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
-  public boolean checkTimeseriesExists(String path) throws IoTDBSessionException {
+  public boolean checkTimeseriesExists(String path)
+      throws StatementExecutionException, IoTDBConnectionException {
     checkPathValidity(path);
     try {
       return executeQueryStatement(String.format("SHOW TIMESERIES %s", path)).hasNext();
     } catch (Exception e) {
-      throw new IoTDBSessionException(e);
+      throw new IoTDBConnectionException(e);
     }
   }
 
@@ -578,19 +575,31 @@ public class Session {
     return resp;
   }
 
-  private synchronized String getTimeZone() throws TException, IoTDBRPCException {
+  private synchronized String getTimeZone()
+      throws StatementExecutionException, IoTDBConnectionException {
     if (zoneId != null) {
       return zoneId.toString();
     }
 
-    TSGetTimeZoneResp resp = client.getTimeZone(sessionId);
+    TSGetTimeZoneResp resp;
+    try {
+      resp = client.getTimeZone(sessionId);
+    } catch (TException e) {
+      throw new IoTDBConnectionException(e);
+    }
     RpcUtils.verifySuccess(resp.getStatus());
     return resp.getTimeZone();
   }
 
-  private synchronized void setTimeZone(String zoneId) throws TException, IoTDBRPCException {
+  private synchronized void setTimeZone(String zoneId)
+      throws StatementExecutionException, IoTDBConnectionException {
     TSSetTimeZoneReq req = new TSSetTimeZoneReq(sessionId, zoneId);
-    TSStatus resp = client.setTimeZone(req);
+    TSStatus resp;
+    try {
+      resp = client.setTimeZone(req);
+    } catch (TException e) {
+      throw new IoTDBConnectionException(e);
+    }
     RpcUtils.verifySuccess(resp);
     this.zoneId = ZoneId.of(zoneId);
   }
@@ -613,7 +622,7 @@ public class Session {
    * @return result set
    */
   public SessionDataSet executeQueryStatement(String sql)
-      throws TException, IoTDBRPCException {
+      throws StatementExecutionException, IoTDBConnectionException {
     if (!checkIsQuery(sql)) {
       throw new IllegalArgumentException("your sql \"" + sql
           + "\" is not a query statement, you should use executeNonQueryStatement method instead.");
@@ -621,7 +630,12 @@ public class Session {
 
     TSExecuteStatementReq execReq = new TSExecuteStatementReq(sessionId, sql, statementId);
     execReq.setFetchSize(fetchSize);
-    TSExecuteStatementResp execResp = client.executeQueryStatement(execReq);
+    TSExecuteStatementResp execResp;
+    try {
+      execResp = client.executeQueryStatement(execReq);
+    } catch (TException e) {
+      throw new IoTDBConnectionException(e);
+    }
 
     RpcUtils.verifySuccess(execResp.getStatus());
     return new SessionDataSet(sql, execResp.getColumns(), execResp.getDataTypeList(),
@@ -633,21 +647,25 @@ public class Session {
    *
    * @param sql non query statement
    */
-  public void executeNonQueryStatement(String sql) throws TException, IoTDBRPCException {
+  public void executeNonQueryStatement(String sql)
+      throws IoTDBConnectionException, StatementExecutionException {
     if (checkIsQuery(sql)) {
       throw new IllegalArgumentException("your sql \"" + sql
           + "\" is a query statement, you should use executeQueryStatement method instead.");
     }
 
     TSExecuteStatementReq execReq = new TSExecuteStatementReq(sessionId, sql, statementId);
-    TSExecuteStatementResp execResp = client.executeUpdateStatement(execReq);
-    RpcUtils.verifySuccess(execResp.getStatus());
+    try {
+      TSExecuteStatementResp execResp = client.executeUpdateStatement(execReq);
+      RpcUtils.verifySuccess(execResp.getStatus());
+    } catch (TException e) {
+      throw new IoTDBConnectionException(e);
+    }
   }
 
-  private void checkPathValidity(String path) throws IoTDBSessionException {
+  private void checkPathValidity(String path) throws StatementExecutionException {
     if (!PATH_PATTERN.matcher(path).matches()) {
-      throw new IoTDBSessionException(
-          String.format("Path [%s] is invalid", path));
+      throw new StatementExecutionException(String.format("Path [%s] is invalid", path));
     }
   }
 }
diff --git a/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java b/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
index 6097eb5..cb5540f 100644
--- a/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
+++ b/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
@@ -24,8 +24,9 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.iotdb.rpc.IoTDBRPCException;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.TSCloseOperationReq;
 import org.apache.iotdb.service.rpc.thrift.TSFetchResultsReq;
 import org.apache.iotdb.service.rpc.thrift.TSFetchResultsResp;
@@ -100,7 +101,7 @@ public class SessionDataSet {
     this.batchSize = batchSize;
   }
 
-  public boolean hasNext() throws SQLException, IoTDBRPCException {
+  public boolean hasNext() throws IoTDBConnectionException, StatementExecutionException {
     if (hasCachedRecord) {
       return true;
     }
@@ -117,7 +118,7 @@ public class SessionDataSet {
           rowsIndex = 0;
         }
       } catch (TException e) {
-        throw new SQLException(
+        throw new IoTDBConnectionException(
             "Cannot fetch result from server, because of network connection: {} ", e);
       }
 
@@ -194,7 +195,6 @@ public class SessionDataSet {
    * judge whether the specified column value is null in the current position
    *
    * @param index column index
-   * @return
    */
   private boolean isNull(int index, int rowNum) {
     byte bitmap = currentBitmap[index];
@@ -202,7 +202,7 @@ public class SessionDataSet {
     return ((flag >>> shift) & bitmap) == 0;
   }
 
-  public RowRecord next() throws SQLException, IoTDBRPCException {
+  public RowRecord next() throws StatementExecutionException, IoTDBConnectionException {
     if (!hasCachedRecord) {
       if (!hasNext()) {
         return null;
@@ -213,16 +213,14 @@ public class SessionDataSet {
     return rowRecord;
   }
 
-  public void closeOperationHandle() throws SQLException {
+  public void closeOperationHandle() throws StatementExecutionException, IoTDBConnectionException {
     try {
       TSCloseOperationReq closeReq = new TSCloseOperationReq(sessionId);
       closeReq.setQueryId(queryId);
       TSStatus closeResp = client.closeOperation(closeReq);
       RpcUtils.verifySuccess(closeResp);
-    } catch (IoTDBRPCException e) {
-      throw new SQLException("Error occurs for close opeation in server side. The reason is " + e);
     } catch (TException e) {
-      throw new SQLException(
+      throw new IoTDBConnectionException(
           "Error occurs when connecting to server for close operation, because: " + e);
     }
   }
diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
index 0c48e5e..8770d15 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
@@ -34,7 +34,8 @@ import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.jdbc.Config;
-import org.apache.iotdb.rpc.IoTDBRPCException;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
 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;
@@ -42,7 +43,6 @@ import org.apache.iotdb.tsfile.read.common.Field;
 import org.apache.iotdb.tsfile.write.record.RowBatch;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.apache.iotdb.tsfile.write.schema.Schema;
-import org.apache.thrift.TException;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -53,7 +53,7 @@ public class IoTDBSessionIT {
   private Session session;
 
   @Before
-  public void setUp() throws Exception {
+  public void setUp() {
     System.setProperty(IoTDBConstant.IOTDB_CONF, "src/test/resources/");
     EnvironmentUtils.closeStatMonitor();
     EnvironmentUtils.envSetUp();
@@ -67,7 +67,7 @@ public class IoTDBSessionIT {
 
   @Test
   public void testAlignByDevice()
-      throws IoTDBSessionException, SQLException, ClassNotFoundException, TException, IoTDBRPCException {
+      throws SQLException, IoTDBConnectionException, StatementExecutionException {
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
 
@@ -82,8 +82,7 @@ public class IoTDBSessionIT {
   }
 
   // it's will output too much to travis, so ignore it
-  public void testTime()
-      throws IoTDBSessionException, SQLException, ClassNotFoundException, TException, IoTDBRPCException {
+  public void testTime() throws IoTDBConnectionException, StatementExecutionException {
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
 
@@ -96,7 +95,7 @@ public class IoTDBSessionIT {
 
   @Test
   public void testBatchInsertSeqAndUnseq()
-      throws IoTDBSessionException, SQLException, ClassNotFoundException, TException, IoTDBRPCException {
+      throws SQLException, ClassNotFoundException, IoTDBConnectionException, StatementExecutionException {
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
 
@@ -120,7 +119,7 @@ public class IoTDBSessionIT {
 
   @Test
   public void testBatchInsert()
-      throws IoTDBSessionException, SQLException, ClassNotFoundException, TException, IoTDBRPCException {
+      throws StatementExecutionException, SQLException, ClassNotFoundException, IoTDBConnectionException {
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
 
@@ -133,7 +132,7 @@ public class IoTDBSessionIT {
     queryForBatch();
   }
 
-  public void testTestMethod() throws IoTDBSessionException {
+  public void testTestMethod() throws StatementExecutionException, IoTDBConnectionException {
 
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
@@ -200,7 +199,8 @@ public class IoTDBSessionIT {
 
   @Test
   public void test()
-      throws ClassNotFoundException, SQLException, IoTDBSessionException, TException, IoTDBRPCException {
+      throws ClassNotFoundException, SQLException, IoTDBSessionException,
+      IoTDBConnectionException, StatementExecutionException {
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
 
@@ -273,7 +273,7 @@ public class IoTDBSessionIT {
   }
 
 
-  private void createTimeseriesForTime() throws IoTDBSessionException {
+  private void createTimeseriesForTime() throws StatementExecutionException, IoTDBConnectionException {
     session.createTimeseries("root.sg1.d1.s1", TSDataType.INT64, TSEncoding.RLE,
         CompressionType.SNAPPY);
     session.createTimeseries("root.sg1.d1.s2", TSDataType.INT64, TSEncoding.RLE,
@@ -294,7 +294,7 @@ public class IoTDBSessionIT {
         CompressionType.SNAPPY);
   }
 
-  private void createTimeseries() throws IoTDBSessionException {
+  private void createTimeseries() throws StatementExecutionException, IoTDBConnectionException {
     session.createTimeseries("root.sg1.d1.s1", TSDataType.INT64, TSEncoding.RLE,
         CompressionType.SNAPPY);
     session.createTimeseries("root.sg1.d1.s2", TSDataType.INT64, TSEncoding.RLE,
@@ -309,7 +309,7 @@ public class IoTDBSessionIT {
         CompressionType.SNAPPY);
   }
 
-  private void insertInBatch() throws IoTDBSessionException {
+  private void insertInBatch() throws IoTDBConnectionException {
     String deviceId = "root.sg1.d2";
     List<String> measurements = new ArrayList<>();
     measurements.add("s1");
@@ -342,7 +342,7 @@ public class IoTDBSessionIT {
     session.insertInBatch(deviceIds, timestamps, measurementsList, valuesList);
   }
 
-  private void insert() throws IoTDBSessionException {
+  private void insert() throws IoTDBConnectionException {
     String deviceId = "root.sg1.d1";
     List<String> measurements = new ArrayList<>();
     measurements.add("s1");
@@ -357,7 +357,7 @@ public class IoTDBSessionIT {
     }
   }
 
-  private void insertRowBatchTest1(String deviceId) throws IoTDBSessionException {
+  private void insertRowBatchTest1(String deviceId) throws IoTDBConnectionException {
     Schema schema = new Schema();
     schema.registerMeasurement(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE));
     schema.registerMeasurement(new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE));
@@ -387,7 +387,7 @@ public class IoTDBSessionIT {
     }
   }
 
-  private void deleteData() throws IoTDBSessionException {
+  private void deleteData() throws IoTDBConnectionException {
     String path1 = "root.sg1.d1.s1";
     String path2 = "root.sg1.d1.s2";
     String path3 = "root.sg1.d1.s3";
@@ -400,7 +400,7 @@ public class IoTDBSessionIT {
     session.deleteData(paths, deleteTime);
   }
 
-  private void deleteTimeseries() throws IoTDBSessionException {
+  private void deleteTimeseries() throws IoTDBConnectionException {
     session.deleteTimeseries("root.sg1.d1.s1");
     session.deleteTimeseries("root.laptop.d1.1_2");
     session.deleteTimeseries("root.laptop.d1.\"1.2.3\"");
@@ -434,7 +434,7 @@ public class IoTDBSessionIT {
   }
 
   private void queryForAlignByDevice()
-      throws SQLException, TException, IoTDBRPCException {
+      throws SQLException, StatementExecutionException, IoTDBConnectionException {
     SessionDataSet sessionDataSet = session
         .executeQueryStatement("select '11', s1, '11' from root.sg1.d1 align by device");
     sessionDataSet.setBatchSize(1024);
@@ -453,7 +453,7 @@ public class IoTDBSessionIT {
   }
 
   private void queryForAlignByDevice2()
-      throws SQLException, TException, IoTDBRPCException {
+      throws SQLException, IoTDBConnectionException, StatementExecutionException {
     SessionDataSet sessionDataSet = session.executeQueryStatement(
         "select '11', s1, '11', s5, s1, s5 from root.sg1.d1 align by device");
     sessionDataSet.setBatchSize(1024);
@@ -497,11 +497,11 @@ public class IoTDBSessionIT {
     }
   }
 
-  public void deleteStorageGroupTest()
-      throws ClassNotFoundException, SQLException, IoTDBSessionException {
+  public void deleteStorageGroupTest() throws ClassNotFoundException, SQLException,
+      IoTDBConnectionException, StatementExecutionException {
     try {
       session.deleteStorageGroup("root.sg1.d1.s1");
-    } catch (IoTDBSessionException e) {
+    } catch (IoTDBConnectionException e) {
       assertEquals("The path root.sg1.d1.s1 is not a deletable storage group", e.getMessage());
     }
     session.deleteStorageGroup("root.sg1");
@@ -537,7 +537,7 @@ public class IoTDBSessionIT {
     }
   }
 
-  private void query4() throws TException, IoTDBRPCException, SQLException {
+  private void query4() throws IoTDBConnectionException, StatementExecutionException {
     SessionDataSet sessionDataSet = session.executeQueryStatement("select * from root.sg1.d2");
     sessionDataSet.setBatchSize(1024);
     int count = 0;
@@ -554,7 +554,7 @@ public class IoTDBSessionIT {
   }
 
 
-  private void query3() throws TException, IoTDBRPCException, SQLException {
+  private void query3() throws IoTDBConnectionException, StatementExecutionException {
     SessionDataSet sessionDataSet = session.executeQueryStatement("select * from root.sg1.d1");
     sessionDataSet.setBatchSize(1024);
     int count = 0;
@@ -571,13 +571,13 @@ public class IoTDBSessionIT {
   }
 
 
-  private void insert_via_sql() throws TException, IoTDBRPCException {
+  private void insert_via_sql() throws IoTDBConnectionException, StatementExecutionException {
     session.executeNonQueryStatement(
         "insert into root.sg1.d1(timestamp,s1, s2, s3) values(100, 1,2,3)");
   }
 
   @Test
-  public void checkPathTest() throws IoTDBSessionException {
+  public void checkPathTest() throws IoTDBConnectionException {
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open();
 
@@ -609,28 +609,30 @@ public class IoTDBSessionIT {
     session.close();
   }
 
-  private void checkSetSG(Session session, String sg, boolean correctStatus) {
+  private void checkSetSG(Session session, String sg, boolean correctStatus)
+      throws IoTDBConnectionException {
     boolean status = true;
     try {
       session.setStorageGroup(sg);
-    } catch (IoTDBSessionException e) {
+    } catch (StatementExecutionException e) {
       status = false;
     }
     assertEquals(correctStatus, status);
   }
 
-  private void checkCreateTimeseries(Session session, String timeseries, boolean correctStatus) {
+  private void checkCreateTimeseries(Session session, String timeseries, boolean correctStatus)
+      throws IoTDBConnectionException {
     boolean status = true;
     try {
       session.createTimeseries(timeseries, TSDataType.INT64, TSEncoding.RLE,
           CompressionType.SNAPPY);
-    } catch (IoTDBSessionException e) {
+    } catch (StatementExecutionException e) {
       status = false;
     }
     assertEquals(correctStatus, status);
   }
 
-  private void insertRowBatchTest2(String deviceId) throws IoTDBSessionException {
+  private void insertRowBatchTest2(String deviceId) throws IoTDBConnectionException {
     Schema schema = new Schema();
     schema.registerMeasurement(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE));
     schema.registerMeasurement(new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE));
@@ -660,7 +662,7 @@ public class IoTDBSessionIT {
     }
   }
 
-  private void insertRowBatchTest3(String deviceId) throws IoTDBSessionException {
+  private void insertRowBatchTest3(String deviceId) throws IoTDBConnectionException {
     Schema schema = new Schema();
     schema.registerMeasurement(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE));
     schema.registerMeasurement(new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE));
@@ -690,7 +692,7 @@ public class IoTDBSessionIT {
     }
   }
 
-  private void insertRowBatchTestForTime(String deviceId) throws IoTDBSessionException {
+  private void insertRowBatchTestForTime(String deviceId) throws IoTDBConnectionException {
     Schema schema = new Schema();
     schema.registerMeasurement(new MeasurementSchema("s1", TSDataType.INT64, TSEncoding.RLE));
     schema.registerMeasurement(new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE));