This is an automated email from the ASF dual-hosted git repository. jiangtian pushed a commit to branch fix_extend_template_with_null in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 42c0c37124d85dd6c44aac8a277a79102ad7c382 Author: Tian Jiang <[email protected]> AuthorDate: Mon Mar 17 15:32:29 2025 +0800 Fix template extension with null value --- .../org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java | 7 +++++++ .../plan/analyze/schema/TemplateSchemaFetcher.java | 11 +++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java index 9945843b091..f3d53c3a461 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java @@ -142,10 +142,15 @@ public class IoTDBExtendTemplateIT extends AbstractSchemaIT { statement.execute("SET DEVICE TEMPLATE t1 to root.db"); + // single-row insertion statement.execute("INSERT INTO root.db.d1(time, s1, s3) values(1, 1, 1)"); statement.execute("INSERT INTO root.db.d2(time, s4, s5) values(1, 1, 1)"); statement.execute("INSERT INTO root.db1.d1(time, s2, s3) values(1, 1, 1)"); + // multi-row insertion with null + statement.execute( + "INSERT INTO root.db.d1(time, s1, s6) values(1, 1, 1), (2, 2, null), (3, 3, 3)"); + String[] sqls = new String[] { "show timeseries", @@ -159,11 +164,13 @@ public class IoTDBExtendTemplateIT extends AbstractSchemaIT { "root.db.d1.s3,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", "root.db.d1.s4,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", "root.db.d1.s5,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", + "root.db.d1.s6,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", "root.db.d2.s1,null,root.db,INT64,PLAIN,LZ4,null,null,null,null,BASE,", "root.db.d2.s2,null,root.db,DOUBLE,RLE,LZ4,null,null,null,null,BASE,", "root.db.d2.s3,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", "root.db.d2.s4,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", "root.db.d2.s5,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", + "root.db.d2.s6,null,root.db,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", "root.db1.d1.s2,null,root.db1,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,", "root.db1.d1.s3,null,root.db1,DOUBLE,GORILLA,LZ4,null,null,null,null,BASE,")) }; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/TemplateSchemaFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/TemplateSchemaFetcher.java index 3ce3fde5569..3516182bbf1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/TemplateSchemaFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/TemplateSchemaFetcher.java @@ -142,12 +142,19 @@ class TemplateSchemaFetcher { measurements = schemaComputationWithAutoCreation.getMeasurements(); for (int j = 0; j < measurements.length; j++) { if (!template.hasSchema(measurements[j])) { + TSDataType dataType = schemaComputationWithAutoCreation.getDataType(j); + if (dataType == null) { + // the data type is not provided and cannot be inferred (the value is also null), + // skip this measurement + continue; + } + extensionMeasurementMap .computeIfAbsent(template.getName(), TemplateExtendInfo::new) .addMeasurement( measurements[j], - schemaComputationWithAutoCreation.getDataType(j), - getDefaultEncoding(schemaComputationWithAutoCreation.getDataType(j)), + dataType, + getDefaultEncoding(dataType), TSFileDescriptor.getInstance().getConfig().getCompressor()); } }
