You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/08/16 10:14:13 UTC

[iotdb] branch master updated: [IOTDB-4047] Fix query NPE after change device alignment (#7009)

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

jackietien 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 41a60b5026 [IOTDB-4047] Fix query NPE after change device alignment (#7009)
41a60b5026 is described below

commit 41a60b50260dbbd510e22b6693f1a53ddee91707
Author: Haonan <hh...@outlook.com>
AuthorDate: Tue Aug 16 18:14:05 2022 +0800

    [IOTDB-4047] Fix query NPE after change device alignment (#7009)
---
 .../aligned/IoTDBDeleteTimeseriesIT.java           | 64 ++++++++++++++++++++++
 .../iotdb/db/engine/memtable/AbstractMemTable.java |  3 +
 2 files changed, 67 insertions(+)

diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeleteTimeseriesIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeleteTimeseriesIT.java
index 34dbe151ab..a86b591b02 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeleteTimeseriesIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeleteTimeseriesIT.java
@@ -169,6 +169,70 @@ public class IoTDBDeleteTimeseriesIT {
     }
   }
 
+  @Test
+  public void deleteTimeseriesAndChangeDeviceAlignmentTest() throws Exception {
+    String[] retArray = new String[] {"1,1.0,2.0,"};
+    int cnt = 0;
+
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+      statement.execute("INSERT INTO root.sg3.d1(timestamp,s1,s2) ALIGNED VALUES(1,1,2)");
+      statement.execute("SHOW DEVICES");
+      try (ResultSet resultSet = statement.getResultSet()) {
+        while (resultSet.next()) {
+          Assert.assertEquals("true", resultSet.getString("isAligned"));
+        }
+      }
+      cnt = 0;
+      statement.execute("DELETE timeseries root.sg3.d1.s1");
+      statement.execute("DELETE timeseries root.sg3.d1.s2");
+      statement.execute("INSERT INTO root.sg3.d1(timestamp,s1,s2) VALUES(1,1,2)");
+      statement.execute("SHOW DEVICES");
+      try (ResultSet resultSet = statement.getResultSet()) {
+        while (resultSet.next()) {
+          Assert.assertEquals("false", resultSet.getString("isAligned"));
+        }
+      }
+      boolean hasResult = statement.execute("SELECT * FROM root.sg3.d1");
+      Assert.assertTrue(hasResult);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+            builder.append(resultSet.getString(i)).append(",");
+          }
+          Assert.assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+      }
+      cnt = 0;
+      statement.execute("DELETE timeseries root.sg3.d1.s1");
+      statement.execute("DELETE timeseries root.sg3.d1.s2");
+      statement.execute("INSERT INTO root.sg3.d1(timestamp,s1,s2) ALIGNED VALUES(1,1,2)");
+      statement.execute("SHOW DEVICES");
+      try (ResultSet resultSet = statement.getResultSet()) {
+        while (resultSet.next()) {
+          Assert.assertEquals("true", resultSet.getString("isAligned"));
+        }
+      }
+      hasResult = statement.execute("SELECT * FROM root.sg3.d1");
+      Assert.assertTrue(hasResult);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+            builder.append(resultSet.getString(i)).append(",");
+          }
+          Assert.assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+      }
+    }
+  }
+
   @Test
   public void deleteTimeSeriesMultiIntervalTest() {
     String[] retArray1 = new String[] {"0,0"};
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
index e008ff8056..91c3375fc1 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
@@ -642,6 +642,9 @@ public abstract class AbstractMemTable implements IMemTable {
       return;
     }
     totalPointsNum -= memChunkGroup.delete(originalPath, devicePath, startTimestamp, endTimestamp);
+    if (memChunkGroup.getMemChunkMap().isEmpty()) {
+      memTableMap.remove(getDeviceID(devicePath));
+    }
   }
 
   @Override