You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/11/03 13:45:16 UTC

[iotdb] branch master updated: [IOTDB-4778][IOTDB-4031][IOTDB-4764][IOTDB-4514] restServer module adaptation and optimization (#7897)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 876564ddc1 [IOTDB-4778][IOTDB-4031][IOTDB-4764][IOTDB-4514] restServer module adaptation and optimization (#7897)
876564ddc1 is described below

commit 876564ddc145b713173bb9cfe862ab79e494c7a3
Author: CloudWise-Lukemiao <76...@users.noreply.github.com>
AuthorDate: Thu Nov 3 21:45:10 2022 +0800

    [IOTDB-4778][IOTDB-4031][IOTDB-4764][IOTDB-4514] restServer module adaptation and optimization (#7897)
---
 .../protocol/rest/filter/AuthorizationFilter.java  |  7 ++-
 .../db/protocol/rest/handler/ExceptionHandler.java | 10 +++--
 .../rest/handler/ExecuteStatementHandler.java      | 52 ++++++++++++++++++++++
 .../protocol/rest/handler/QueryDataSetHandler.java | 37 +++++++++++----
 .../rest/handler/StatementConstructionHandler.java |  3 +-
 .../db/protocol/rest/impl/RestApiServiceImpl.java  | 22 ++++++++-
 6 files changed, 114 insertions(+), 17 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/filter/AuthorizationFilter.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/filter/AuthorizationFilter.java
index 1ddeca7287..9dafb0911d 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/filter/AuthorizationFilter.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/filter/AuthorizationFilter.java
@@ -16,11 +16,13 @@
  */
 package org.apache.iotdb.db.protocol.rest.filter;
 
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.auth.AuthException;
 import org.apache.iotdb.commons.auth.authorizer.IAuthorizer;
 import org.apache.iotdb.db.auth.AuthorizerManager;
 import org.apache.iotdb.db.conf.rest.IoTDBRestServiceDescriptor;
 import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
+import org.apache.iotdb.rpc.ConfigNodeConnectionException;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.glassfish.jersey.internal.util.Base64;
@@ -108,7 +110,8 @@ public class AuthorizationFilter implements ContainerRequestFilter {
     user.setUsername(split[0]);
     user.setPassword(split[1]);
     try {
-      if (!authorizer.login(split[0], split[1])) {
+      TSStatus tsStatus = ((AuthorizerManager) authorizer).checkUser(split[0], split[1]);
+      if (tsStatus.code != 200) {
         Response resp =
             Response.status(Status.UNAUTHORIZED)
                 .type(MediaType.APPLICATION_JSON)
@@ -120,7 +123,7 @@ public class AuthorizationFilter implements ContainerRequestFilter {
         containerRequestContext.abortWith(resp);
         return null;
       }
-    } catch (AuthException e) {
+    } catch (ConfigNodeConnectionException e) {
       LOGGER.warn(e.getMessage(), e);
       Response resp =
           Response.status(Status.INTERNAL_SERVER_ERROR)
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java
index 97f2eb7001..2bc6b1017a 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExceptionHandler.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.exception.sql.SQLParserException;
+import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.exception.sql.StatementAnalyzeException;
 import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -68,12 +69,13 @@ public class ExceptionHandler {
     } else if (e instanceof ParseCancellationException) {
       responseResult.setMessage(e.getMessage());
       responseResult.setCode(TSStatusCode.SQL_PARSE_ERROR.getStatusCode());
-    } else if (e instanceof SQLParserException) {
+    } else if (e instanceof SQLParserException || e instanceof StatementAnalyzeException) {
       responseResult.setMessage(e.getMessage());
       responseResult.setCode(TSStatusCode.METADATA_ERROR.getStatusCode());
-    } else if (!(e instanceof IOException)
-        && !(e instanceof NullPointerException)
-        && !(e instanceof StatementAnalyzeException)) {
+    } else if (e instanceof SemanticException) {
+      responseResult.setMessage(e.getMessage());
+      responseResult.setCode(TSStatusCode.SEMANTIC_ERROR.getStatusCode());
+    } else if (!(e instanceof IOException) && !(e instanceof RuntimeException)) {
       responseResult.setMessage(e.getMessage());
       responseResult.setCode(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode());
     } else {
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java
new file mode 100644
index 0000000000..17167fefd9
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/ExecuteStatementHandler.java
@@ -0,0 +1,52 @@
+/*
+ * 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 agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.iotdb.db.protocol.rest.handler;
+
+import org.apache.iotdb.db.mpp.plan.constant.StatementType;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStatement;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DropSchemaTemplateStatement;
+import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
+
+public class ExecuteStatementHandler {
+  private ExecuteStatementHandler() {}
+
+  public static boolean validateStatement(Statement statement) {
+    return !(statement instanceof QueryStatement)
+        && !(statement instanceof ShowStatement
+            && !(statement instanceof DropSchemaTemplateStatement))
+        && !(statement instanceof AuthorStatement
+            && (((AuthorStatement) statement)
+                    .getAuthorType()
+                    .name()
+                    .equals(StatementType.LIST_USER.name())
+                || ((AuthorStatement) statement)
+                    .getAuthorType()
+                    .name()
+                    .equals(StatementType.LIST_ROLE.name())
+                || ((AuthorStatement) statement)
+                    .getAuthorType()
+                    .name()
+                    .equals(StatementType.LIST_USER_PRIVILEGE.name())
+                || ((AuthorStatement) statement)
+                    .getAuthorType()
+                    .name()
+                    .equals(StatementType.LIST_ROLE_PRIVILEGE.name())));
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java
index 3616722a8d..14f54c7a37 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/QueryDataSetHandler.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildPathsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStatement;
+import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
 import org.apache.iotdb.db.protocol.rest.model.ExecutionStatus;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -36,6 +37,7 @@ import javax.ws.rs.core.Response;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 public class QueryDataSetHandler {
@@ -48,7 +50,7 @@ public class QueryDataSetHandler {
   public static Response fillQueryDataSet(
       IQueryExecution queryExecution, Statement statement, int actualRowSizeLimit)
       throws IoTDBException {
-    if (statement instanceof ShowStatement) {
+    if (statement instanceof ShowStatement || statement instanceof AuthorStatement) {
       return fillShowPlanDataSet(queryExecution, actualRowSizeLimit);
     } else if (statement instanceof QueryStatement) {
       if (((QueryStatement) statement).isAggregationQuery()
@@ -72,12 +74,7 @@ public class QueryDataSetHandler {
       throws IoTDBException {
     org.apache.iotdb.db.protocol.rest.model.QueryDataSet targetDataSet =
         new org.apache.iotdb.db.protocol.rest.model.QueryDataSet();
-    DatasetHeader header = queryExecution.getDatasetHeader();
-    List<String> resultColumns = header.getRespColumns();
-    for (String resultColumn : resultColumns) {
-      targetDataSet.addExpressionsItem(resultColumn);
-      targetDataSet.addValuesItem(new ArrayList<>());
-    }
+
     return fillQueryDataSetWithTimestamps(
         queryExecution, actualRowSizeLimit, targetDataSet, timePrecision);
   }
@@ -141,6 +138,15 @@ public class QueryDataSetHandler {
       throws IoTDBException {
     int fetched = 0;
     int columnNum = queryExecution.getOutputValueColumnCount();
+
+    DatasetHeader header = queryExecution.getDatasetHeader();
+    List<String> resultColumns = header.getRespColumns();
+    Map<String, Integer> headerMap = header.getColumnNameIndexMap();
+    for (String resultColumn : resultColumns) {
+      targetDataSet.addExpressionsItem(resultColumn);
+      targetDataSet.addValuesItem(new ArrayList<>());
+    }
+
     while (true) {
       if (0 < actualRowSizeLimit && actualRowSizeLimit <= fetched) {
         return Response.ok()
@@ -155,6 +161,11 @@ public class QueryDataSetHandler {
       }
       Optional<TsBlock> optionalTsBlock = queryExecution.getBatchResult();
       if (!optionalTsBlock.isPresent()) {
+        if (fetched == 0) {
+          targetDataSet.setTimestamps(new ArrayList<>());
+          targetDataSet.setValues(new ArrayList<>());
+          return Response.ok().entity(targetDataSet).build();
+        }
         break;
       }
       TsBlock tsBlock = optionalTsBlock.get();
@@ -166,8 +177,8 @@ public class QueryDataSetHandler {
                 ? tsBlock.getTimeByIndex(i)
                 : tsBlock.getTimeByIndex(i) / timePrecision);
       }
-      for (int k = 0; k < columnNum; k++) {
-        Column column = tsBlock.getColumn(k);
+      for (int k = 0; k < resultColumns.size(); k++) {
+        Column column = tsBlock.getColumn(headerMap.get(resultColumns.get(k)));
         List<Object> targetDataSetColumn = targetDataSet.getValues().get(k);
         for (int i = 0; i < currentCount; i++) {
           fetched++;
@@ -209,10 +220,18 @@ public class QueryDataSetHandler {
       }
       Optional<TsBlock> optionalTsBlock = queryExecution.getBatchResult();
       if (!optionalTsBlock.isPresent()) {
+        if (fetched == 0) {
+          targetDataSet.setValues(new ArrayList<>());
+          return Response.ok().entity(targetDataSet).build();
+        }
         break;
       }
       TsBlock tsBlock = optionalTsBlock.get();
       int currentCount = tsBlock.getPositionCount();
+      if (currentCount == 0) {
+        targetDataSet.setValues(new ArrayList<>());
+        return Response.ok().entity(targetDataSet).build();
+      }
       for (int k = 0; k < columnNum; k++) {
         Column column = tsBlock.getColumn(k);
         List<Object> targetDataSetColumn = targetDataSet.getValues().get(k);
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java
index f01f809c86..ad53165282 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/handler/StatementConstructionHandler.java
@@ -125,7 +125,8 @@ public class StatementConstructionHandler {
             if (rawData.get(columnIndex).get(rowIndex) == null) {
               bitMaps[columnIndex].mark(rowIndex);
             } else {
-              doubleValues[rowIndex] = (double) rawData.get(columnIndex).get(rowIndex);
+              doubleValues[rowIndex] =
+                  Double.valueOf(String.valueOf(rawData.get(columnIndex).get(rowIndex)));
             }
           }
           columns[columnIndex] = doubleValues;
diff --git a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java
index 28537790ad..65431a95af 100644
--- a/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/protocol/rest/impl/RestApiServiceImpl.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
 import org.apache.iotdb.db.protocol.rest.RestApiService;
 import org.apache.iotdb.db.protocol.rest.handler.AuthorizationHandler;
 import org.apache.iotdb.db.protocol.rest.handler.ExceptionHandler;
+import org.apache.iotdb.db.protocol.rest.handler.ExecuteStatementHandler;
 import org.apache.iotdb.db.protocol.rest.handler.QueryDataSetHandler;
 import org.apache.iotdb.db.protocol.rest.handler.RequestValidationHandler;
 import org.apache.iotdb.db.protocol.rest.handler.StatementConstructionHandler;
@@ -85,6 +86,16 @@ public class RestApiServiceImpl extends RestApiService {
 
       Statement statement =
           StatementGenerator.createStatement(sql.getSql(), ZoneId.systemDefault());
+
+      if (!ExecuteStatementHandler.validateStatement(statement)) {
+        return Response.ok()
+            .entity(
+                new org.apache.iotdb.db.protocol.rest.model.ExecutionStatus()
+                    .code(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())
+                    .message(TSStatusCode.EXECUTE_STATEMENT_ERROR.name()))
+            .build();
+      }
+
       Response response = authorizationHandler.checkAuthority(securityContext, statement);
       if (response != null) {
         return response;
@@ -122,6 +133,16 @@ public class RestApiServiceImpl extends RestApiService {
 
       Statement statement =
           StatementGenerator.createStatement(sql.getSql(), ZoneId.systemDefault());
+
+      if (ExecuteStatementHandler.validateStatement(statement)) {
+        return Response.ok()
+            .entity(
+                new org.apache.iotdb.db.protocol.rest.model.ExecutionStatus()
+                    .code(TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode())
+                    .message(TSStatusCode.EXECUTE_STATEMENT_ERROR.name()))
+            .build();
+      }
+
       Response response = authorizationHandler.checkAuthority(securityContext, statement);
       if (response != null) {
         return response;
@@ -148,7 +169,6 @@ public class RestApiServiceImpl extends RestApiService {
             .build();
       }
       IQueryExecution queryExecution = COORDINATOR.getQueryExecution(queryId);
-
       try (SetThreadName threadName = new SetThreadName(result.queryId.getId())) {
         return QueryDataSetHandler.fillQueryDataSet(
             queryExecution,