You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ch...@apache.org on 2021/03/31 07:58:55 UTC
[iotdb] 01/01: fix stackoverflow when parse plan failed
This is an automated email from the ASF dual-hosted git repository.
chaow pushed a commit to branch fix_plan_corrupt_bug
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit f2d6f84360e0ff2235dac59908bd9472bc04c9d1
Author: chaow <xu...@gmail.com>
AuthorDate: Tue Mar 30 20:26:11 2021 +0800
fix stackoverflow when parse plan failed
---
.../db/qp/physical/crud/InsertMultiTabletPlan.java | 3 +++
.../iotdb/db/qp/physical/crud/InsertRowsPlan.java | 3 +++
.../iotdb/db/qp/physical/crud/InsertTabletPlan.java | 2 +-
.../qp/physical/sys/CreateMultiTimeSeriesPlan.java | 20 ++++++++++++++++++++
4 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java
index 6f73a74..6749354 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertMultiTabletPlan.java
@@ -199,6 +199,9 @@ public class InsertMultiTabletPlan extends InsertPlan {
@Override
public void checkIntegrity() throws QueryProcessException {
+ if (insertTabletPlanList.isEmpty()) {
+ throw new QueryProcessException("sub tablet is empty.");
+ }
for (InsertTabletPlan insertTabletPlan : insertTabletPlanList) {
insertTabletPlan.checkIntegrity();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java
index cdd35ab..28f4f3f 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowsPlan.java
@@ -81,6 +81,9 @@ public class InsertRowsPlan extends InsertPlan {
@Override
public void checkIntegrity() throws QueryProcessException {
+ if (insertRowPlanList.isEmpty()) {
+ throw new QueryProcessException("sub plan are empty.");
+ }
for (InsertRowPlan insertRowPlan : insertRowPlanList) {
insertRowPlan.checkIntegrity();
}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
index 97b36cc..8ca7a40 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
@@ -604,7 +604,7 @@ public class InsertTabletPlan extends InsertPlan {
@Override
public void checkIntegrity() throws QueryProcessException {
super.checkIntegrity();
- if (columns == null) {
+ if (columns == null || columns.length == 0) {
throw new QueryProcessException("Values are null");
}
if (measurements.length != columns.length) {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
index 9ebc54b..4c0e854 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.qp.physical.sys;
import org.apache.iotdb.db.exception.metadata.IllegalPathException;
+import org.apache.iotdb.db.exception.query.QueryProcessException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.qp.logical.Operator;
import org.apache.iotdb.db.qp.physical.PhysicalPlan;
@@ -33,6 +34,7 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -323,4 +325,22 @@ public class CreateMultiTimeSeriesPlan extends PhysicalPlan {
public int hashCode() {
return Objects.hash(paths, dataTypes, encodings, compressors);
}
+
+ @Override
+ public void checkIntegrity() throws QueryProcessException {
+ if (paths == null || paths.isEmpty()) {
+ throw new QueryProcessException("sub timeseries are empty");
+ }
+ if (paths.size() != dataTypes.size()) {
+ throw new QueryProcessException(
+ String.format(
+ "Measurements length [%d] does not match " + " datatype length [%d]",
+ paths.size(), dataTypes.size()));
+ }
+ for (PartialPath path : paths) {
+ if (path == null) {
+ throw new QueryProcessException("Paths contain null: " + Arrays.toString(paths.toArray()));
+ }
+ }
+ }
}