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

chenyz 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 e38f7d9c4e8 Fix query data with authority return unexpected result 
#11576
e38f7d9c4e8 is described below

commit e38f7d9c4e852824c8865bd130ad09d0b4cfb92c
Author: Chen YZ <[email protected]>
AuthorDate: Mon Nov 20 18:09:02 2023 +0800

    Fix query data with authority return unexpected result #11576
    
    Fix query data with authority return unexpected result #11576
---
 .../org/apache/iotdb/db/it/auth/IoTDBAuthIT.java   | 53 ++++++++++++++++++++++
 .../common/schematree/ClusterSchemaTree.java       | 10 +++-
 .../queryengine/common/schematree/ISchemaTree.java |  3 ++
 .../visitor/SchemaTreeVisitorFactory.java          |  5 ++
 .../queryengine/plan/analyze/AnalyzeVisitor.java   | 10 ++--
 .../schemaregion/mtree/traverser/Traverser.java    |  1 -
 6 files changed, 75 insertions(+), 7 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java 
b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java
index 4b08c6d9ad4..e50955bd049 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBAuthIT.java
@@ -42,7 +42,9 @@ import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -1115,4 +1117,55 @@ public class IoTDBAuthIT {
     ans = ",root.t1.**,READ_DATA,false,\n" + 
",root.t1.**,READ_SCHEMA,false,\n";
     validateResultSet(resultSet, ans);
   }
+
+  @Test
+  public void testQueryTemplate() throws SQLException {
+    // 1. revoke from user/role
+    Connection adminCon = EnvFactory.getEnv().getConnection();
+    Statement adminStmt = adminCon.createStatement();
+    adminStmt.execute("CREATE USER user1 'password'");
+    adminStmt.execute("GRANT READ_DATA ON root.sg.d1.** TO USER user1 with 
grant option;");
+    adminStmt.execute("GRANT READ_DATA ON root.sg.aligned_template.temperature 
TO USER user1;");
+    adminStmt.execute("CREATE DATABASE root.sg;");
+    adminStmt.execute(
+        "create device template t1 aligned (temperature FLOAT 
encoding=Gorilla, status BOOLEAN encoding=PLAIN);");
+    adminStmt.execute("set device template t1 to root.sg.aligned_template;");
+    adminStmt.execute("insert into root.sg.d1(time,s1,s2) values(1,1,1)");
+    adminStmt.execute("insert into root.sg.d2(time,s1,s2) values(1,1,1)");
+    adminStmt.execute(
+        "insert into root.sg.aligned_template(time,temperature,status) 
values(1,20,true)");
+    try (ResultSet resultSet = adminStmt.executeQuery("select * from 
root.**;")) {
+      Set<String> standards =
+          new HashSet<>(
+              Arrays.asList(
+                  "Time",
+                  "root.sg.aligned_template.temperature",
+                  "root.sg.aligned_template.status",
+                  "root.sg.d2.s1",
+                  "root.sg.d2.s2",
+                  "root.sg.d1.s1",
+                  "root.sg.d1.s2"));
+      ResultSetMetaData metaData = resultSet.getMetaData();
+      for (int i = 1; i < metaData.getColumnCount() + 1; i++) {
+        Assert.assertTrue(standards.remove(metaData.getColumnName(i)));
+      }
+      Assert.assertTrue(standards.isEmpty());
+    }
+    Connection user1Con = EnvFactory.getEnv().getConnection("user1", 
"password");
+    Statement user1Stmt = user1Con.createStatement();
+    try (ResultSet resultSet = user1Stmt.executeQuery("select * from 
root.**;")) {
+      Set<String> standards =
+          new HashSet<>(
+              Arrays.asList(
+                  "Time",
+                  "root.sg.aligned_template.temperature",
+                  "root.sg.d1.s1",
+                  "root.sg.d1.s2"));
+      ResultSetMetaData metaData = resultSet.getMetaData();
+      for (int i = 1; i < metaData.getColumnCount() + 1; i++) {
+        Assert.assertTrue(standards.remove(metaData.getColumnName(i)));
+      }
+      Assert.assertTrue(standards.isEmpty());
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ClusterSchemaTree.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ClusterSchemaTree.java
index 6d0f6bc1f45..317d0473a0b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ClusterSchemaTree.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ClusterSchemaTree.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.queryengine.common.schematree;
 
 import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
 import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.commons.utils.TestOnly;
@@ -73,6 +74,8 @@ public class ClusterSchemaTree implements ISchemaTree {
 
   private Map<Integer, Template> templateMap = new HashMap<>();
 
+  private PathPatternTree authorityScope;
+
   public ClusterSchemaTree() {
     root = new SchemaInternalNode(PATH_ROOT);
   }
@@ -97,7 +100,7 @@ public class ClusterSchemaTree implements ISchemaTree {
       PartialPath pathPattern, int slimit, int soffset, boolean isPrefixMatch) 
{
     try (SchemaTreeVisitorWithLimitOffsetWrapper<MeasurementPath> visitor =
         SchemaTreeVisitorFactory.createSchemaTreeMeasurementVisitor(
-            root, pathPattern, isPrefixMatch, slimit, soffset)) {
+            root, pathPattern, isPrefixMatch, slimit, soffset, 
authorityScope)) {
       visitor.setTemplateMap(templateMap);
       return new Pair<>(visitor.getAllResult(), visitor.getNextOffset());
     }
@@ -535,4 +538,9 @@ public class ClusterSchemaTree implements ISchemaTree {
   public boolean isEmpty() {
     return root.getChildren() == null || root.getChildren().isEmpty();
   }
+
+  @Override
+  public void setAuthorityScope(PathPatternTree scope) {
+    this.authorityScope = scope;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ISchemaTree.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ISchemaTree.java
index c32c0e56c86..9917af2096c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ISchemaTree.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/ISchemaTree.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.queryengine.common.schematree;
 
 import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.db.schemaengine.template.Template;
 import org.apache.iotdb.tsfile.utils.Pair;
 
@@ -98,4 +99,6 @@ public interface ISchemaTree {
    * @return whether there's view in this schema tree
    */
   boolean hasLogicalViewMeasurement();
+
+  void setAuthorityScope(PathPatternTree scope);
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/visitor/SchemaTreeVisitorFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/visitor/SchemaTreeVisitorFactory.java
index a1cf8c13434..8b4c722af5f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/visitor/SchemaTreeVisitorFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/schematree/visitor/SchemaTreeVisitorFactory.java
@@ -51,6 +51,11 @@ public class SchemaTreeVisitorFactory {
         new SchemaTreeMeasurementVisitor(root, pathPattern, isPrefixMatch), 
slimit, soffset);
   }
 
+  public static SchemaTreeMeasurementVisitor 
createSchemaTreeMeasurementVisitor(
+      SchemaNode root, PartialPath pathPattern, PathPatternTree scope) {
+    return new SchemaTreeMeasurementVisitor(root, pathPattern, false, scope);
+  }
+
   public static SchemaTreeVisitorWithLimitOffsetWrapper<MeasurementPath>
       createSchemaTreeMeasurementVisitor(
           SchemaNode root,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index e813503ee91..bd468967cf4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -33,7 +33,6 @@ import org.apache.iotdb.commons.partition.SchemaPartition;
 import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
-import org.apache.iotdb.commons.schema.SchemaConstant;
 import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
 import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
 import org.apache.iotdb.commons.service.metric.PerformanceOverviewMetrics;
@@ -177,6 +176,7 @@ import static 
org.apache.iotdb.commons.conf.IoTDBConstant.ALLOWED_SCHEMA_PROPS;
 import static org.apache.iotdb.commons.conf.IoTDBConstant.DEADBAND;
 import static org.apache.iotdb.commons.conf.IoTDBConstant.LOSS;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.ONE_LEVEL_PATH_WILDCARD;
+import static org.apache.iotdb.commons.schema.SchemaConstant.ALL_MATCH_PATTERN;
 import static 
org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant.DEVICE;
 import static 
org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant.ENDTIME;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.PARTITION_FETCHER;
@@ -364,6 +364,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       } else {
         schemaTree = 
schemaFetcher.fetchSchema(concatPathRewriter.getPatternTree(), context);
       }
+      schemaTree.setAuthorityScope(queryStatement.getAuthorityScope());
 
       // make sure paths in logical view is fetched
       updateSchemaTreeByViews(analysis, schemaTree);
@@ -479,9 +480,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     boolean needToReFetch = false;
     boolean useLogicalView = false;
     try {
-      Pair<List<MeasurementPath>, Integer> tempPair =
-          originSchemaTree.searchMeasurementPaths(new PartialPath("root.**"));
-      for (MeasurementPath measurementPath : tempPair.left) {
+      for (MeasurementPath measurementPath :
+          originSchemaTree.searchMeasurementPaths(ALL_MATCH_PATTERN).left) {
         if (measurementPath.getMeasurementSchema().isLogicalView()) {
           useLogicalView = true;
           LogicalViewSchema logicalViewSchema =
@@ -2924,7 +2924,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       LogicalViewSchema logicalViewSchema;
       PartialPath sourcePathOfAliasSeries;
       for (MeasurementPath measurementPath :
-          
schemaTree.searchMeasurementPaths(SchemaConstant.ALL_MATCH_PATTERN).left) {
+          schemaTree.searchMeasurementPaths(ALL_MATCH_PATTERN).left) {
         measurementSchema = measurementPath.getMeasurementSchema();
         if (measurementSchema.isLogicalView()) {
           logicalViewSchema = (LogicalViewSchema) measurementSchema;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
index b73624f2a1b..35d825fe074 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/traverser/Traverser.java
@@ -231,7 +231,6 @@ public abstract class Traverser<R, N extends IMNode<N>> 
extends AbstractTreeVisi
 
   @Override
   protected Iterator<N> getChildrenIterator(N parent) throws MetadataException 
{
-    IMNodeIterator<N> currentChildrenIterator;
     if (parent.isAboveDatabase()) {
       return new MNodeIterator<>(parent.getChildren().values().iterator());
     } else {

Reply via email to