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 2021/08/09 09:48:52 UTC
[iotdb] branch rel/0.12 updated: [IOTDB-1475][To rel/0.12]
MeasurementId check while create timeseries or template/ disable time or
timestamp in path (#3699)
This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch rel/0.12
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/0.12 by this push:
new 2ddd003 [IOTDB-1475][To rel/0.12] MeasurementId check while create timeseries or template/ disable time or timestamp in path (#3699)
2ddd003 is described below
commit 2ddd003c3b30db421b25e511a415ca39bee6a94e
Author: zyk990424 <38...@users.noreply.github.com>
AuthorDate: Mon Aug 9 17:48:29 2021 +0800
[IOTDB-1475][To rel/0.12] MeasurementId check while create timeseries or template/ disable time or timestamp in path (#3699)
---
.../org/apache/iotdb/db/metadata/MManager.java | 18 ++++++
.../java/org/apache/iotdb/db/metadata/MTree.java | 23 ++++++-
.../iotdb/db/metadata/MManagerBasicTest.java | 71 ++++++++++++++++++++++
3 files changed, 109 insertions(+), 3 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 9ce528a..06ab615 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -96,6 +96,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@@ -2038,7 +2039,10 @@ public class MManager {
public void createDeviceTemplate(CreateTemplatePlan plan) throws MetadataException {
try {
+ checkTemplateSchemaNames(plan.getSchemaNames());
+
Template template = new Template(plan);
+
if (templateMap.putIfAbsent(plan.getName(), template) != null) {
// already have template
throw new DuplicatedTemplateException(plan.getName());
@@ -2053,6 +2057,20 @@ public class MManager {
}
}
+ private void checkTemplateSchemaNames(List<String> schemaNames) throws MetadataException {
+ // check schema name.
+ String processedName;
+ for (String schemaName : schemaNames) {
+ processedName = schemaName.trim().toLowerCase(Locale.ENGLISH);
+ if ("time".equals(processedName)
+ || "timestamp".equals(processedName)
+ || (schemaName.contains(".")
+ && !(schemaName.startsWith("\"") && schemaName.endsWith("\"")))) {
+ throw new MetadataException(String.format("%s is an illegal schema name", schemaName));
+ }
+ }
+ }
+
public void setDeviceTemplate(SetDeviceTemplatePlan plan) throws MetadataException {
try {
Template template = templateMap.get(plan.getTemplateName());
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index ab9629c..3fc53c8 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -73,6 +73,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;
@@ -216,7 +217,7 @@ public class MTree implements Serializable {
if (nodeNames.length <= 2 || !nodeNames[0].equals(root.getName())) {
throw new IllegalPathException(path.getFullPath());
}
- checkTimeseries(path.getFullPath());
+ checkTimeseries(path);
MNode cur = root;
boolean hasSetStorageGroup = false;
Template upperTemplate = cur.getDeviceTemplate();
@@ -283,11 +284,27 @@ public class MTree implements Serializable {
}
}
- private void checkTimeseries(String timeseries) throws IllegalPathException {
- if (!IoTDBConfig.NODE_PATTERN.matcher(timeseries).matches()) {
+ private void checkTimeseries(PartialPath timeseries) throws MetadataException {
+ if (!IoTDBConfig.NODE_PATTERN.matcher(timeseries.getFullPath()).matches()) {
throw new IllegalPathException(
String.format("The timeseries name contains unsupported character. %s", timeseries));
}
+
+ // filter special id, including "time" and "timeseries"
+ for (String nodeName : timeseries.getNodes()) {
+ nodeName = nodeName.trim().toLowerCase(Locale.ENGLISH);
+ if ("time".equals(nodeName) || "timestamp".equals(nodeName)) {
+ throw new IllegalPathException(timeseries.getFullPath());
+ }
+ }
+
+ String measurementId = timeseries.getMeasurement();
+ // check measurementId syntax
+ // only measurementId may be named separately from fullPath by user via API
+ if (measurementId.contains(".")
+ && !(measurementId.startsWith("\"") && measurementId.endsWith("\""))) {
+ throw new MetadataException(String.format("%s is an illegal measurementId", measurementId));
+ }
}
// check if sdt parameters are valid
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index a62c9a8..925f2bf 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -23,7 +23,10 @@ import org.apache.iotdb.db.exception.metadata.IllegalPathException;
import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
import org.apache.iotdb.db.metadata.mnode.MNode;
+import org.apache.iotdb.db.metadata.mnode.MeasurementMNode;
import org.apache.iotdb.db.qp.physical.crud.CreateTemplatePlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
import org.apache.iotdb.db.qp.physical.crud.SetDeviceTemplatePlan;
import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
@@ -1260,4 +1263,72 @@ public class MManagerBasicTest {
fail(e.getMessage());
}
}
+
+ @Test
+ public void testMeasurementIdWhileInsert() throws Exception {
+ MManager manager = IoTDB.metaManager;
+
+ PartialPath deviceId = new PartialPath("root.sg.d");
+ InsertPlan insertPlan;
+
+ insertPlan = getInsertPlan("\"a.b\"");
+ manager.getSeriesSchemasAndReadLockDevice(insertPlan);
+ assertTrue(manager.isPathExist(deviceId.concatNode("\"a.b\"")));
+
+ String[] illegalMeasurementIds = {"a.b", "time", "timestamp", "TIME", "TIMESTAMP"};
+ for (String measurementId : illegalMeasurementIds) {
+ insertPlan = getInsertPlan(measurementId);
+ try {
+ manager.getSeriesSchemasAndReadLockDevice(insertPlan);
+ assertFalse(manager.isPathExist(deviceId.concatNode(measurementId)));
+ } catch (MetadataException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private InsertPlan getInsertPlan(String measurementId) throws MetadataException {
+ PartialPath deviceId = new PartialPath("root.sg.d");
+ String[] measurementList = {measurementId};
+ String[] values = {"1"};
+ MeasurementMNode[] measurementMNodes = new MeasurementMNode[1];
+ InsertPlan insertPlan = new InsertRowPlan(deviceId, 1L, measurementList, values);
+ insertPlan.setMeasurementMNodes(measurementMNodes);
+ return insertPlan;
+ }
+
+ @Test
+ public void testTemplateNameCheckWhileCreate() {
+ MManager manager = IoTDB.metaManager;
+ String[] illegalSchemaNames = {"a.b", "time", "timestamp", "TIME", "TIMESTAMP"};
+ for (String schemaName : illegalSchemaNames) {
+ CreateTemplatePlan plan = getCreateTemplatePlan(schemaName);
+ try {
+ manager.createDeviceTemplate(plan);
+ } catch (MetadataException e) {
+ Assert.assertEquals(
+ String.format("%s is an illegal schema name", schemaName), e.getMessage());
+ }
+ }
+ }
+
+ private CreateTemplatePlan getCreateTemplatePlan(String schemaName) {
+ List<List<String>> measurementList = new ArrayList<>();
+ measurementList.add(Collections.singletonList("s0"));
+
+ List<List<TSDataType>> dataTypeList = new ArrayList<>();
+ dataTypeList.add(Collections.singletonList(TSDataType.INT32));
+
+ List<List<TSEncoding>> encodingList = new ArrayList<>();
+ encodingList.add(Collections.singletonList(TSEncoding.RLE));
+
+ List<CompressionType> compressionTypes = new ArrayList<>();
+ compressionTypes.add(compressionType);
+
+ List<String> schemaNames = new ArrayList<>();
+ schemaNames.add(schemaName);
+
+ return new CreateTemplatePlan(
+ "template1", schemaNames, measurementList, dataTypeList, encodingList, compressionTypes);
+ }
}