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 <[email protected]> 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); + } } } }
