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 {