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/02 23:59:43 UTC

[iotdb] branch master updated: [IOTDB-4824] Fix error when insert a null value into a non-existed timeseries (#7884)

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 5874879e54 [IOTDB-4824] Fix error when insert a null value into a non-existed timeseries (#7884)
5874879e54 is described below

commit 5874879e5495a40ae79dbc38f4ee3e14d52f655b
Author: Haonan <hh...@outlook.com>
AuthorDate: Thu Nov 3 07:59:39 2022 +0800

    [IOTDB-4824] Fix error when insert a null value into a non-existed timeseries (#7884)
---
 .../db/it/schema/IoTDBAutoCreateSchemaIT.java      | 19 +++++++++++
 .../db/mpp/plan/analyze/ClusterSchemaFetcher.java  | 39 ++++++++++++----------
 .../planner/plan/node/write/InsertRowNode.java     |  3 +-
 .../planner/plan/node/write/InsertTabletNode.java  |  3 +-
 4 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java
index c26f1ddb59..cab57cadd9 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java
@@ -201,4 +201,23 @@ public class IoTDBAutoCreateSchemaIT {
     }
     Assert.assertTrue(resultList.contains(storageGroup));
   }
+
+  /**
+   * insert data when storage group hasn't been set, timeseries hasn't been created and have null
+   * values
+   */
+  @Test
+  public void testInsertAutoCreate3() {
+    String[] sqls = {
+      "INSERT INTO root.sg0.d3(timestamp,s1) values(1,null)",
+      "INSERT INTO root.sg0.d3(timestamp,s1,s2) values(1,null,2)",
+    };
+    for (String sql : sqls) {
+      try {
+        statement.execute(sql);
+      } catch (SQLException e) {
+        Assert.assertTrue(e.getMessage().contains("Path [root.sg0.d3.s1] does not exist"));
+      }
+    }
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java
index c11970455a..22964f5ad4 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java
@@ -390,25 +390,30 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     indexOfMissingMeasurements.forEach(
         index -> {
           TSDataType tsDataType = getDataType.apply(index);
-          missingMeasurements.add(measurements[index]);
-          dataTypesOfMissingMeasurement.add(tsDataType);
-          encodingsOfMissingMeasurement.add(
-              encodings == null ? getDefaultEncoding(tsDataType) : encodings[index]);
-          compressionTypesOfMissingMeasurement.add(
-              compressionTypes == null
-                  ? TSFileDescriptor.getInstance().getConfig().getCompressor()
-                  : compressionTypes[index]);
+          // tsDataType == null means insert null value to a non-exist series
+          // should skip creating them
+          if (tsDataType != null) {
+            missingMeasurements.add(measurements[index]);
+            dataTypesOfMissingMeasurement.add(tsDataType);
+            encodingsOfMissingMeasurement.add(
+                encodings == null ? getDefaultEncoding(tsDataType) : encodings[index]);
+            compressionTypesOfMissingMeasurement.add(
+                compressionTypes == null
+                    ? TSFileDescriptor.getInstance().getConfig().getCompressor()
+                    : compressionTypes[index]);
+          }
         });
 
-    schemaTree.mergeSchemaTree(
-        internalCreateTimeseries(
-            devicePath,
-            missingMeasurements,
-            dataTypesOfMissingMeasurement,
-            encodingsOfMissingMeasurement,
-            compressionTypesOfMissingMeasurement,
-            isAligned));
-
+    if (!missingMeasurements.isEmpty()) {
+      schemaTree.mergeSchemaTree(
+          internalCreateTimeseries(
+              devicePath,
+              missingMeasurements,
+              dataTypesOfMissingMeasurement,
+              encodingsOfMissingMeasurement,
+              compressionTypesOfMissingMeasurement,
+              isAligned));
+    }
     return schemaTree;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
index 5f0b82eba9..8b544b5c17 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
@@ -42,6 +42,7 @@ import org.apache.iotdb.db.utils.TypeInferenceUtils;
 import org.apache.iotdb.db.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.db.wal.buffer.WALEntryValue;
 import org.apache.iotdb.db.wal.utils.WALWriteUtils;
+import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
 import org.apache.iotdb.tsfile.exception.NotImplementedException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
@@ -188,7 +189,7 @@ public class InsertRowNode extends InsertNode implements WALEntryValue {
     if (deviceSchemaInfo == null) {
       throw new PathNotExistException(
           Arrays.stream(measurements)
-              .map(s -> devicePath.getFullPath() + s)
+              .map(s -> devicePath.getFullPath() + TsFileConstant.PATH_SEPARATOR + s)
               .collect(Collectors.toList()));
     }
     if (deviceSchemaInfo.isAligned() != isAligned) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
index ba4f196ebf..29f563dd20 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
@@ -40,6 +40,7 @@ import org.apache.iotdb.db.utils.TimePartitionUtils;
 import org.apache.iotdb.db.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.db.wal.buffer.WALEntryValue;
 import org.apache.iotdb.db.wal.utils.WALWriteUtils;
+import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
 import org.apache.iotdb.tsfile.exception.NotImplementedException;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -182,7 +183,7 @@ public class InsertTabletNode extends InsertNode implements WALEntryValue {
     if (deviceSchemaInfo == null) {
       throw new PathNotExistException(
           Arrays.stream(measurements)
-              .map(s -> devicePath.getFullPath() + s)
+              .map(s -> devicePath.getFullPath() + TsFileConstant.PATH_SEPARATOR + s)
               .collect(Collectors.toList()));
     }
     if (deviceSchemaInfo.isAligned() != isAligned) {