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 2024/09/18 04:28:56 UTC

(iotdb) branch ty/fixNPEBug created (now 7c8596f9c99)

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

jackietien pushed a change to branch ty/fixNPEBug
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 7c8596f9c99 Fix NPE after keeping all null rows in memtable

This branch includes the following new commits:

     new 7c8596f9c99 Fix NPE after keeping all null rows in memtable

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(iotdb) 01/01: Fix NPE after keeping all null rows in memtable

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch ty/fixNPEBug
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 7c8596f9c995f95ded1ea2daeb307f7b2e6a5692
Author: JackieTien97 <ja...@gmail.com>
AuthorDate: Wed Sep 18 12:28:43 2024 +0800

    Fix NPE after keeping all null rows in memtable
---
 .../db/it/aligned/IoTDBAlignedLastQueryIT.java     | 112 +++++++++++++++++++++
 .../db/utils/datastructure/AlignedTVList.java      |   6 +-
 2 files changed, 117 insertions(+), 1 deletion(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBAlignedLastQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBAlignedLastQueryIT.java
index d8a04e08f19..57da4f30c47 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBAlignedLastQueryIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBAlignedLastQueryIT.java
@@ -340,4 +340,116 @@ public class IoTDBAlignedLastQueryIT {
     selectSomeAlignedLastWithTimeFilterTest();
     selectSomeAlignedAndNonAlignedLastWithTimeFilterTest();
   }
+
+  @Test
+  public void testNullInMemtable() {
+    String[] sqls =
+        new String[] {
+          "create aligned timeseries root.ln_1.tb_6141(风机退出_BOOLEAN BOOLEAN encoding=RLE,`出水NH4-N_DOUBLE` DOUBLE encoding=GORILLA,膜产水状态_BOOLEAN BOOLEAN encoding=RLE,11_TEXT TEXT encoding=PLAIN,产水间歇运行时间设置_DOUBLE DOUBLE encoding=GORILLA,文本_TEXT TEXT encoding=PLAIN, 风机投入_BOOLEAN BOOLEAN encoding=RLE,枚举_INT32 INT32 encoding=RLE,出水TP_DOUBLE DOUBLE encoding=GORILLA,水管流速_DOUBLE DOUBLE encoding=GORILLA,CO2_DOUBLE DOUBLE encoding=GORILLA,`开关量-运行_BOOLEAN` BOOLEAN encoding=RLE,功能码_DOUBLE DOUBLE enc [...]
+          "alter timeseries root.ln_1.tb_6141.风机退出_BOOLEAN upsert alias=风机退出;",
+          "alter timeseries root.ln_1.tb_6141.水管流速_DOUBLE upsert alias=水管流速;",
+          "alter timeseries root.ln_1.tb_6141.CO2_DOUBLE upsert alias=CO2;",
+          "alter timeseries root.ln_1.tb_6141.风机投入_BOOLEAN upsert alias=风机投入;",
+          "alter timeseries root.ln_1.tb_6141.产水间歇运行时间设置_DOUBLE upsert alias=产水间歇运行时间设置;",
+          "alter timeseries root.ln_1.tb_6141.膜产水状态_BOOLEAN upsert alias=膜产水状态;",
+          "alter timeseries root.ln_1.tb_6141.枚举_INT32 upsert alias=枚举;",
+          "alter timeseries root.ln_1.tb_6141.出水TP_DOUBLE upsert alias=出水TP;",
+          "alter timeseries root.ln_1.tb_6141.文本_TEXT upsert alias=文本;",
+          "alter timeseries root.ln_1.tb_6141.`出水NH4-N_DOUBLE` upsert alias=`出水NH4-N`;",
+          "alter timeseries root.ln_1.tb_6141.功能码_DOUBLE upsert alias=功能码;",
+          "alter timeseries root.ln_1.tb_6141.11_TEXT upsert alias=`11`;",
+          "alter timeseries root.ln_1.tb_6141.`开关量-运行_BOOLEAN` upsert alias=`开关量-运行`;",
+          "insert into root.ln_1.tb_6141(time,产水间歇运行时间设置_DOUBLE) aligned values(1679365910000,10.0);",
+          "insert into root.ln_1.tb_6141(time,出水TP_DOUBLE) aligned values(1679365910000,15.0);",
+          "insert into root.ln_1.tb_6141(time,功能码_DOUBLE) aligned values(1679477545000,2.0);",
+          "insert into root.ln_1.tb_6141(time,文本_TEXT) aligned values(1675995566000,52);",
+          "insert into root.ln_1.tb_6141(time,枚举_INT32) aligned values(1675995566000,2);",
+          "insert into root.ln_1.tb_6141(time,水管流速_DOUBLE) aligned values(1679365910000,15.0);",
+          "insert into root.ln_1.tb_6141(time,膜产水状态_BOOLEAN) aligned values(1677033625000,true);",
+          "insert into root.ln_1.tb_6141(time,风机投入_BOOLEAN) aligned values(1675995566000,true);",
+          "insert into root.ln_1.tb_6141(time,风机退出_BOOLEAN) aligned values(1675995566000,false);",
+          "insert into root.ln_1.tb_6141(time,11_TEXT) aligned values(1679365910000,13);",
+          "insert into root.ln_1.tb_6141(time,CO2_DOUBLE) aligned values(1679365910000,12.0);",
+          "insert into root.ln_1.tb_6141(time,`出水NH4-N_DOUBLE`) aligned values(1679365910000,12.0);",
+          "insert into root.ln_1.tb_6141(time,`开关量-运行_BOOLEAN`) aligned values(1675995566000,false);",
+        };
+
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+
+      // create aligned and non-aligned time series
+      for (String sql : sqls) {
+        statement.addBatch(sql);
+      }
+      statement.executeBatch();
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+
+    Set<String> retSet =
+        new HashSet<>(
+            Arrays.asList(
+                "1679477545000,root.ln_1.tb_6141.功能码_DOUBLE,2.0,DOUBLE",
+                "1675995566000,root.ln_1.tb_6141.文本_TEXT,52,TEXT"));
+
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select last 功能码,文本 from root.ln_1.tb_6141;")) {
+        int cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(TIMESEIRES_STR)
+                  + ","
+                  + resultSet.getString(VALUE_STR)
+                  + ","
+                  + resultSet.getString(DATA_TYPE_STR);
+          assertTrue(ans, retSet.contains(ans));
+          cnt++;
+        }
+        assertEquals(retSet.size(), cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+
+    retSet =
+        new HashSet<>(
+            Arrays.asList(
+                "1679477545000,root.ln_1.tb_6141.功能码_DOUBLE,2.0,DOUBLE",
+                "1677033625000,root.ln_1.tb_6141.膜产水状态_BOOLEAN,true,BOOLEAN",
+                "1675995566000,root.ln_1.tb_6141.文本_TEXT,52,TEXT"));
+
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select last 功能码,膜产水状态,文本 from root.ln_1.tb_6141;")) {
+        int cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(TIMESEIRES_STR)
+                  + ","
+                  + resultSet.getString(VALUE_STR)
+                  + ","
+                  + resultSet.getString(DATA_TYPE_STR);
+          assertTrue(ans, retSet.contains(ans));
+          cnt++;
+        }
+        assertEquals(retSet.size(), cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
index dcf920afd7d..676831bd231 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
@@ -1115,7 +1115,11 @@ public abstract class AlignedTVList extends TVList {
       Column column = previousTsBlock.getColumn(columnIndex);
       for (int i = 0; i < previousValidRowCount; i++) {
         if (hasAnyNonNullValue[i]) {
-          columnBuilder.write(column, i);
+          if (column.isNull(i)) {
+            columnBuilder.appendNull();
+          } else {
+            columnBuilder.write(column, i);
+          }
         }
       }
     }