This is an automated email from the ASF dual-hosted git repository.
jiangtian 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 db1c5fcbfe9 Fix null pointer exception casued by measurements values
and measureSchemas values are not consistent (#15532)
db1c5fcbfe9 is described below
commit db1c5fcbfe9e98f942bd1fbe34d26be1447fc719
Author: libo <[email protected]>
AuthorDate: Tue May 20 19:07:44 2025 +0800
Fix null pointer exception casued by measurements values and measureSchemas
values are not consistent (#15532)
* fix the problem of null pointer below:
NullPointerException: Cannot invoke
"org.apache.tsfile.write.schema.MeasurementSchema.serializeTo(java.io.OutputStream)"
because "this.measurementSchemas[i]" is null
* fix the problem of null pointer for table model below:
NullPointerException: Cannot invoke
"org.apache.tsfile.write.schema.MeasurementSchema.serializeTo(java.io.OutputStream)"
because "this.measurementSchemas[i]" is null
---
.../plan/planner/LogicalPlanVisitor.java | 55 ++++++++++++++++++----
.../plan/relational/planner/RelationPlanner.java | 30 ++++++++++--
2 files changed, 71 insertions(+), 14 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
index 1a8a3cf487b..5a49e6d0d98 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
@@ -91,6 +91,7 @@ import org.apache.iotdb.db.schemaengine.template.Template;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.utils.Pair;
+import org.apache.tsfile.write.schema.MeasurementSchema;
import java.util.ArrayList;
import java.util.HashMap;
@@ -459,15 +460,19 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
@Override
public PlanNode visitInsertTablet(
InsertTabletStatement insertTabletStatement, MPPQueryContext context) {
+ String[] measurements = insertTabletStatement.getMeasurements();
+ MeasurementSchema[] measurementSchemas =
insertTabletStatement.getMeasurementSchemas();
+ stayConsistent(measurements, measurementSchemas);
+
// convert insert statement to insert node
InsertTabletNode insertNode =
new InsertTabletNode(
context.getQueryId().genPlanNodeId(),
insertTabletStatement.getDevicePath(),
insertTabletStatement.isAligned(),
- insertTabletStatement.getMeasurements(),
+ measurements,
insertTabletStatement.getDataTypes(),
- insertTabletStatement.getMeasurementSchemas(),
+ measurementSchemas,
insertTabletStatement.getTimes(),
insertTabletStatement.getBitMaps(),
insertTabletStatement.getColumns(),
@@ -478,15 +483,19 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
@Override
public PlanNode visitInsertRow(InsertRowStatement insertRowStatement,
MPPQueryContext context) {
+ String[] measurements = insertRowStatement.getMeasurements();
+ MeasurementSchema[] measurementSchemas =
insertRowStatement.getMeasurementSchemas();
+ stayConsistent(measurements, measurementSchemas);
+
// convert insert statement to insert node
InsertRowNode insertNode =
new InsertRowNode(
context.getQueryId().genPlanNodeId(),
insertRowStatement.getDevicePath(),
insertRowStatement.isAligned(),
- insertRowStatement.getMeasurements(),
+ measurements,
insertRowStatement.getDataTypes(),
- insertRowStatement.getMeasurementSchemas(),
+ measurementSchemas,
insertRowStatement.getTime(),
insertRowStatement.getValues(),
insertRowStatement.isNeedInferType());
@@ -714,14 +723,19 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
for (int i = 0; i <
insertRowsStatement.getInsertRowStatementList().size(); i++) {
InsertRowStatement insertRowStatement =
insertRowsStatement.getInsertRowStatementList().get(i);
+
+ String[] measurements = insertRowStatement.getMeasurements();
+ MeasurementSchema[] measurementSchemas =
insertRowStatement.getMeasurementSchemas();
+ stayConsistent(measurements, measurementSchemas);
+
InsertRowNode insertRowNode =
new InsertRowNode(
insertRowsNode.getPlanNodeId(),
insertRowStatement.getDevicePath(),
insertRowStatement.isAligned(),
- insertRowStatement.getMeasurements(),
+ measurements,
insertRowStatement.getDataTypes(),
- insertRowStatement.getMeasurementSchemas(),
+ measurementSchemas,
insertRowStatement.getTime(),
insertRowStatement.getValues(),
insertRowStatement.isNeedInferType());
@@ -740,14 +754,19 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
for (int i = 0; i <
insertMultiTabletsStatement.getInsertTabletStatementList().size(); i++) {
InsertTabletStatement insertTabletStatement =
insertMultiTabletsStatement.getInsertTabletStatementList().get(i);
+
+ String[] measurements = insertTabletStatement.getMeasurements();
+ MeasurementSchema[] measurementSchemas =
insertTabletStatement.getMeasurementSchemas();
+ stayConsistent(measurements, measurementSchemas);
+
InsertTabletNode insertTabletNode =
new InsertTabletNode(
insertMultiTabletsNode.getPlanNodeId(),
insertTabletStatement.getDevicePath(),
insertTabletStatement.isAligned(),
- insertTabletStatement.getMeasurements(),
+ measurements,
insertTabletStatement.getDataTypes(),
- insertTabletStatement.getMeasurementSchemas(),
+ measurementSchemas,
insertTabletStatement.getTimes(),
insertTabletStatement.getBitMaps(),
insertTabletStatement.getColumns(),
@@ -771,14 +790,19 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
for (int i = 0; i <
insertRowsOfOneDeviceStatement.getInsertRowStatementList().size(); i++) {
InsertRowStatement insertRowStatement =
insertRowsOfOneDeviceStatement.getInsertRowStatementList().get(i);
+
+ String[] measurements = insertRowStatement.getMeasurements();
+ MeasurementSchema[] measurementSchemas =
insertRowStatement.getMeasurementSchemas();
+ stayConsistent(measurements, measurementSchemas);
+
InsertRowNode insertRowNode =
new InsertRowNode(
insertRowsOfOneDeviceNode.getPlanNodeId(),
insertRowStatement.getDevicePath(),
insertRowStatement.isAligned(),
- insertRowStatement.getMeasurements(),
+ measurements,
insertRowStatement.getDataTypes(),
- insertRowStatement.getMeasurementSchemas(),
+ measurementSchemas,
insertRowStatement.getTime(),
insertRowStatement.getValues(),
insertRowStatement.isNeedInferType());
@@ -988,4 +1012,15 @@ public class LogicalPlanVisitor extends
StatementVisitor<PlanNode, MPPQueryConte
.planLimit(showLogicalViewStatement.getLimit())
.getRoot();
}
+
+ private static void stayConsistent(
+ String[] measurements, MeasurementSchema[] measurementSchemas) {
+ int minLength = Math.min(measurements.length, measurementSchemas.length);
+ for (int j = 0; j < minLength; j++) {
+ if (measurements[j] == null || measurementSchemas[j] == null) {
+ measurements[j] = null;
+ measurementSchemas[j] = null;
+ }
+ }
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
index 8f7d9817f3c..94f6137dc3c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
@@ -95,6 +95,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.apache.tsfile.read.common.type.Type;
+import org.apache.tsfile.write.schema.MeasurementSchema;
import java.util.ArrayList;
import java.util.Collection;
@@ -759,14 +760,19 @@ public class RelationPlanner extends
AstVisitor<RelationPlan, Void> {
@Override
protected RelationPlan visitInsertTablet(InsertTablet node, Void context) {
final InsertTabletStatement insertTabletStatement =
node.getInnerTreeStatement();
+
+ String[] measurements = insertTabletStatement.getMeasurements();
+ MeasurementSchema[] measurementSchemas =
insertTabletStatement.getMeasurementSchemas();
+ stayConsistent(measurements, measurementSchemas);
+
RelationalInsertTabletNode insertNode =
new RelationalInsertTabletNode(
idAllocator.genPlanNodeId(),
insertTabletStatement.getDevicePath(),
insertTabletStatement.isAligned(),
- insertTabletStatement.getMeasurements(),
+ measurements,
insertTabletStatement.getDataTypes(),
- insertTabletStatement.getMeasurementSchemas(),
+ measurementSchemas,
insertTabletStatement.getTimes(),
insertTabletStatement.getBitMaps(),
insertTabletStatement.getColumns(),
@@ -790,19 +796,24 @@ public class RelationPlanner extends
AstVisitor<RelationPlan, Void> {
protected RelationalInsertRowNode fromInsertRowStatement(
final InsertRowStatement insertRowStatement) {
+
+ String[] measurements = insertRowStatement.getMeasurements();
+ MeasurementSchema[] measurementSchemas =
insertRowStatement.getMeasurementSchemas();
+ stayConsistent(measurements, measurementSchemas);
+
final RelationalInsertRowNode insertNode =
new RelationalInsertRowNode(
idAllocator.genPlanNodeId(),
insertRowStatement.getDevicePath(),
insertRowStatement.isAligned(),
- insertRowStatement.getMeasurements(),
+ measurements,
insertRowStatement.getDataTypes(),
+ measurementSchemas,
insertRowStatement.getTime(),
insertRowStatement.getValues(),
insertRowStatement.isNeedInferType(),
insertRowStatement.getColumnCategories());
insertNode.setFailedMeasurementNumber(insertRowStatement.getFailedMeasurementNumber());
-
insertNode.setMeasurementSchemas(insertRowStatement.getMeasurementSchemas());
return insertNode;
}
@@ -1002,4 +1013,15 @@ public class RelationPlanner extends
AstVisitor<RelationPlan, Void> {
return new RelationPlan(root, analysis.getScope(node),
outputSymbols.build(), outerContext);
}
+
+ private static void stayConsistent(
+ String[] measurements, MeasurementSchema[] measurementSchemas) {
+ int minLength = Math.min(measurements.length, measurementSchemas.length);
+ for (int j = 0; j < minLength; j++) {
+ if (measurements[j] == null || measurementSchemas[j] == null) {
+ measurements[j] = null;
+ measurementSchemas[j] = null;
+ }
+ }
+ }
}