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

jackietien pushed a commit to branch TIMECHODB-395
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 8d6c5884d280fef871e509fef4cd19e7fffd9d55
Author: JackieTien97 <[email protected]>
AuthorDate: Wed Nov 22 15:34:53 2023 +0800

    Fix AutoCreateSchema using template without WRITE_SCHEMA
---
 .../analyze/schema/AutoCreateSchemaExecutor.java   | 86 +++++++++-------------
 .../InternalBatchActivateTemplateStatement.java    | 33 ++++++++-
 .../template/AlterSchemaTemplateStatement.java     | 14 ++++
 3 files changed, 80 insertions(+), 53 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
index 1d30bc26859..5340cd9c378 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
@@ -20,12 +20,10 @@
 package org.apache.iotdb.db.queryengine.plan.analyze.schema;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.exception.IoTDBException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.service.metric.PerformanceOverviewMetrics;
 import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -82,6 +80,7 @@ class AutoCreateSchemaExecutor {
   }
 
   private ExecutionResult executeStatement(Statement statement, 
MPPQueryContext context) {
+
     return coordinator.execute(
         statement,
         SessionManager.getInstance().requestQueryId(),
@@ -195,44 +194,12 @@ class AutoCreateSchemaExecutor {
       List<String> measurementList,
       List<TSDataType> dataTypeList,
       MPPQueryContext context) {
-    long startTime = System.nanoTime();
-    try {
-      String userName = context.getSession().getUserName();
-      if (!AuthorityChecker.SUPER_USER.equals(userName)) {
-        TSStatus status =
-            AuthorityChecker.getTSStatus(
-                AuthorityChecker.checkSystemPermission(
-                    userName, PrivilegeType.EXTEND_TEMPLATE.ordinal()),
-                PrivilegeType.EXTEND_TEMPLATE);
-        if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-          throw new RuntimeException(new IoTDBException(status.getMessage(), 
status.getCode()));
-        }
-      }
-    } finally {
-      
PerformanceOverviewMetrics.getInstance().recordAuthCost(System.nanoTime() - 
startTime);
-    }
     internalExtendTemplate(templateName, measurementList, dataTypeList, null, 
null, context);
   }
 
   // Used for insert records or tablets
   void autoExtendTemplate(
       Map<String, TemplateExtendInfo> templateExtendInfoMap, MPPQueryContext 
context) {
-    long startTime = System.nanoTime();
-    try {
-      String userName = context.getSession().getUserName();
-      if (!AuthorityChecker.SUPER_USER.equals(userName)) {
-        TSStatus status =
-            AuthorityChecker.getTSStatus(
-                AuthorityChecker.checkSystemPermission(
-                    userName, PrivilegeType.EXTEND_TEMPLATE.ordinal()),
-                PrivilegeType.EXTEND_TEMPLATE);
-        if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-          throw new RuntimeException(new IoTDBException(status.getMessage(), 
status.getCode()));
-        }
-      }
-    } finally {
-      
PerformanceOverviewMetrics.getInstance().recordAuthCost(System.nanoTime() - 
startTime);
-    }
     TemplateExtendInfo templateExtendInfo;
     for (Map.Entry<String, TemplateExtendInfo> entry : 
templateExtendInfoMap.entrySet()) {
       templateExtendInfo = entry.getValue().deduplicate();
@@ -535,9 +502,14 @@ class AutoCreateSchemaExecutor {
   }
 
   private void internalActivateTemplate(PartialPath devicePath, 
MPPQueryContext context) {
-    ExecutionResult executionResult =
-        executeStatement(new ActivateTemplateStatement(devicePath), context);
-    TSStatus status = executionResult.status;
+    ActivateTemplateStatement statement = new 
ActivateTemplateStatement(devicePath);
+    TSStatus status =
+        AuthorityChecker.checkAuthority(statement, 
context.getSession().getUserName());
+    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      throw new RuntimeException(new IoTDBException(status.getMessage(), 
status.getCode()));
+    }
+    ExecutionResult executionResult = executeStatement(statement, context);
+    status = executionResult.status;
     if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()
         && status.getCode() != 
TSStatusCode.TEMPLATE_IS_IN_USE.getStatusCode()) {
       throw new SemanticException(new IoTDBException(status.getMessage(), 
status.getCode()));
@@ -547,10 +519,15 @@ class AutoCreateSchemaExecutor {
   private void internalActivateTemplate(
       Map<PartialPath, Pair<Template, PartialPath>> 
devicesNeedActivateTemplate,
       MPPQueryContext context) {
-    ExecutionResult executionResult =
-        executeStatement(
-            new 
InternalBatchActivateTemplateStatement(devicesNeedActivateTemplate), context);
-    TSStatus status = executionResult.status;
+    InternalBatchActivateTemplateStatement statement =
+        new 
InternalBatchActivateTemplateStatement(devicesNeedActivateTemplate);
+    TSStatus status =
+        AuthorityChecker.checkAuthority(statement, 
context.getSession().getUserName());
+    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      throw new RuntimeException(new IoTDBException(status.getMessage(), 
status.getCode()));
+    }
+    ExecutionResult executionResult = executeStatement(statement, context);
+    status = executionResult.status;
     if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()
         || status.getCode() == 
TSStatusCode.TEMPLATE_IS_IN_USE.getStatusCode()) {
       return;
@@ -621,17 +598,22 @@ class AutoCreateSchemaExecutor {
       List<CompressionType> compressionTypeList,
       MPPQueryContext context) {
 
-    ExecutionResult executionResult =
-        executeStatement(
-            new AlterSchemaTemplateStatement(
-                templateName,
-                measurementList,
-                dataTypeList,
-                encodingList,
-                compressionTypeList,
-                TemplateAlterOperationType.EXTEND_TEMPLATE),
-            context);
-    TSStatus status = executionResult.status;
+    AlterSchemaTemplateStatement statement =
+        new AlterSchemaTemplateStatement(
+            templateName,
+            measurementList,
+            dataTypeList,
+            encodingList,
+            compressionTypeList,
+            TemplateAlterOperationType.EXTEND_TEMPLATE);
+    TSStatus status =
+        AuthorityChecker.checkAuthority(statement, 
context.getSession().getUserName());
+    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      throw new RuntimeException(new IoTDBException(status.getMessage(), 
status.getCode()));
+    }
+
+    ExecutionResult executionResult = executeStatement(statement, context);
+    status = executionResult.status;
     if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()
         && status.getCode()
             != 
TSStatusCode.MEASUREMENT_ALREADY_EXISTS_IN_TEMPLATE.getStatusCode()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java
index ca2c5c79e65..06775c3ef5c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/internal/InternalBatchActivateTemplateStatement.java
@@ -19,16 +19,22 @@
 
 package org.apache.iotdb.db.queryengine.plan.statement.internal;
 
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
+import org.apache.iotdb.db.schemaengine.template.ClusterTemplateManager;
 import org.apache.iotdb.db.schemaengine.template.Template;
+import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.utils.Pair;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 // This is only used for auto activate template on multi devices while 
inserting data
 public class InternalBatchActivateTemplateStatement extends Statement {
@@ -49,7 +55,32 @@ public class InternalBatchActivateTemplateStatement extends 
Statement {
 
   @Override
   public List<PartialPath> getPaths() {
-    return new ArrayList<>(deviceMap.keySet());
+    ClusterTemplateManager clusterTemplateManager = 
ClusterTemplateManager.getInstance();
+    List<String> templatePaths = new ArrayList<>();
+    for (PartialPath path : deviceMap.keySet()) {
+      Pair<Template, PartialPath> templateSetInfo =
+          clusterTemplateManager.checkTemplateSetInfo(path);
+      if (templateSetInfo == null) {
+        continue;
+      }
+      templatePaths.addAll(templateSetInfo.left.getSchemaMap().keySet());
+    }
+    return deviceMap.keySet().stream()
+        .flatMap(path -> templatePaths.stream().map(path::concatNode))
+        .collect(Collectors.toList());
+  }
+
+  @Override
+  public TSStatus checkPermissionBeforeProcess(String userName) {
+    if (AuthorityChecker.SUPER_USER.equals(userName)) {
+      return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
+    }
+    List<PartialPath> checkedPaths = getPaths();
+    return AuthorityChecker.getTSStatus(
+        AuthorityChecker.checkPatternPermission(
+            userName, checkedPaths, PrivilegeType.WRITE_SCHEMA.ordinal()),
+        checkedPaths,
+        PrivilegeType.WRITE_SCHEMA);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java
index 1e070a1040a..ca17b7d725d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/template/AlterSchemaTemplateStatement.java
@@ -19,7 +19,10 @@
 
 package org.apache.iotdb.db.queryengine.plan.statement.metadata.template;
 
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.auth.entity.PrivilegeType;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
 import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
@@ -28,6 +31,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
 import org.apache.iotdb.db.schemaengine.template.TemplateAlterOperationType;
 import org.apache.iotdb.db.schemaengine.template.alter.TemplateAlterInfo;
 import org.apache.iotdb.db.schemaengine.template.alter.TemplateExtendInfo;
+import org.apache.iotdb.rpc.TSStatusCode;
 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;
@@ -79,6 +83,16 @@ public class AlterSchemaTemplateStatement extends Statement 
implements IConfigSt
     return Collections.emptyList();
   }
 
+  @Override
+  public TSStatus checkPermissionBeforeProcess(String userName) {
+    if (AuthorityChecker.SUPER_USER.equals(userName)) {
+      return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
+    }
+    return AuthorityChecker.getTSStatus(
+        AuthorityChecker.checkSystemPermission(userName, 
PrivilegeType.EXTEND_TEMPLATE.ordinal()),
+        PrivilegeType.EXTEND_TEMPLATE);
+  }
+
   @Override
   public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
     return visitor.visitAlterSchemaTemplate(this, context);

Reply via email to