You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/08/25 13:48:43 UTC
[iotdb] branch master updated: [IOTDB-4181] Check empty insert statement and return directly (#7130)
This is an automated email from the ASF dual-hosted git repository.
haonan 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 856abd4437 [IOTDB-4181] Check empty insert statement and return directly (#7130)
856abd4437 is described below
commit 856abd44370862a3c8b6e9cd66ba995536fc9754
Author: Alan Choo <43...@users.noreply.github.com>
AuthorDate: Thu Aug 25 21:48:36 2022 +0800
[IOTDB-4181] Check empty insert statement and return directly (#7130)
---
.../db/mpp/plan/parser/StatementGenerator.java | 24 +++++++++++++++----
.../plan/statement/crud/InsertBaseStatement.java | 3 +++
.../crud/InsertMultiTabletsStatement.java | 5 ++++
.../plan/statement/crud/InsertRowStatement.java | 5 ++++
.../crud/InsertRowsOfOneDeviceStatement.java | 5 ++++
.../plan/statement/crud/InsertRowsStatement.java | 5 ++++
.../plan/statement/crud/InsertTabletStatement.java | 9 +++++++
.../service/thrift/impl/ClientRPCServiceImpl.java | 28 ++++++++++++++++++++++
8 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
index 489126c1e2..0478b11864 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
@@ -248,7 +248,10 @@ public class StatementGenerator {
}
insertTabletStatement.setDataTypes(dataTypes);
insertTabletStatement.setAligned(req.isAligned);
-
+ // skip empty tablet
+ if (insertTabletStatement.isEmpty()) {
+ continue;
+ }
insertTabletStatementList.add(insertTabletStatement);
}
@@ -268,6 +271,10 @@ public class StatementGenerator {
statement.setTime(req.getTimestamps().get(i));
statement.fillValues(req.valuesList.get(i));
statement.setAligned(req.isAligned);
+ // skip empty statement
+ if (statement.isEmpty()) {
+ continue;
+ }
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
@@ -288,7 +295,10 @@ public class StatementGenerator {
statement.setTime(req.getTimestamps().get(i));
statement.setNeedInferType(true);
statement.setAligned(req.isAligned);
-
+ // skip empty statement
+ if (statement.isEmpty()) {
+ continue;
+ }
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
@@ -308,7 +318,10 @@ public class StatementGenerator {
statement.setTime(req.timestamps.get(i));
statement.fillValues(req.valuesList.get(i));
statement.setAligned(req.isAligned);
-
+ // skip empty statement
+ if (statement.isEmpty()) {
+ continue;
+ }
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
@@ -330,7 +343,10 @@ public class StatementGenerator {
statement.setTime(req.timestamps.get(i));
statement.setNeedInferType(true);
statement.setAligned(req.isAligned);
-
+ // skip empty statement
+ if (statement.isEmpty()) {
+ continue;
+ }
insertRowStatementList.add(statement);
}
insertStatement.setInsertRowStatementList(insertRowStatementList);
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertBaseStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertBaseStatement.java
index f418b604c8..1de24f70b3 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertBaseStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertBaseStatement.java
@@ -73,6 +73,9 @@ public abstract class InsertBaseStatement extends Statement {
isAligned = aligned;
}
+ /** Returns true when this statement is empty and no need to write into the server */
+ public abstract boolean isEmpty();
+
@Override
public List<PartialPath> getPaths() {
return Collections.emptyList();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertMultiTabletsStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertMultiTabletsStatement.java
index 2e72a8fa3f..75eff705e0 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertMultiTabletsStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertMultiTabletsStatement.java
@@ -81,6 +81,11 @@ public class InsertMultiTabletsStatement extends InsertBaseStatement {
return alignedList;
}
+ @Override
+ public boolean isEmpty() {
+ return insertTabletStatementList.isEmpty();
+ }
+
public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
return visitor.visitInsertMultiTablets(this, context);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowStatement.java
index 0f819570ea..3972d0cf48 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowStatement.java
@@ -84,6 +84,11 @@ public class InsertRowStatement extends InsertBaseStatement {
isNeedInferType = needInferType;
}
+ @Override
+ public boolean isEmpty() {
+ return values.length == 0;
+ }
+
public void fillValues(ByteBuffer buffer) throws QueryProcessException {
this.values = new Object[measurements.length];
this.dataTypes = new TSDataType[measurements.length];
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsOfOneDeviceStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsOfOneDeviceStatement.java
index e79ee67917..a18c19db45 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsOfOneDeviceStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsOfOneDeviceStatement.java
@@ -47,6 +47,11 @@ public class InsertRowsOfOneDeviceStatement extends InsertBaseStatement {
/** the InsertRowsStatement list */
private List<InsertRowStatement> insertRowStatementList;
+ @Override
+ public boolean isEmpty() {
+ return insertRowStatementList.isEmpty();
+ }
+
public List<InsertRowStatement> getInsertRowStatementList() {
return insertRowStatementList;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsStatement.java
index 363a2ddc48..8314759daa 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertRowsStatement.java
@@ -81,6 +81,11 @@ public class InsertRowsStatement extends InsertBaseStatement {
this.insertRowStatementList = insertRowStatementList;
}
+ @Override
+ public boolean isEmpty() {
+ return insertRowStatementList.isEmpty();
+ }
+
public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
return visitor.visitInsertRows(this, context);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java
index fff3b8f184..7621adf041 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java
@@ -77,6 +77,15 @@ public class InsertTabletStatement extends InsertBaseStatement {
this.times = times;
}
+ @Override
+ public boolean isEmpty() {
+ return rowCount == 0
+ || times.length == 0
+ || measurements.length == 0
+ || dataTypes.length == 0
+ || columns.length == 0;
+ }
+
public List<TTimePartitionSlot> getTimePartitionSlots() {
List<TTimePartitionSlot> result = new ArrayList<>();
long startTime =
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
index bab10ce4e3..21fed2010e 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
@@ -722,6 +722,10 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
// Step 1: TODO(INSERT) transfer from TSInsertTabletsReq to Statement
InsertRowsStatement statement = (InsertRowsStatement) StatementGenerator.createStatement(req);
+ // return success when this statement is empty because server doesn't need to execute it
+ if (statement.isEmpty()) {
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ }
// permission check
TSStatus status = AuthorityChecker.checkAuthority(statement, req.sessionId);
@@ -773,6 +777,10 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
// Step 1: TODO(INSERT) transfer from TSInsertTabletsReq to Statement
InsertRowsOfOneDeviceStatement statement =
(InsertRowsOfOneDeviceStatement) StatementGenerator.createStatement(req);
+ // return success when this statement is empty because server doesn't need to execute it
+ if (statement.isEmpty()) {
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ }
// permission check
TSStatus status = AuthorityChecker.checkAuthority(statement, req.sessionId);
@@ -824,6 +832,10 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
// Step 1: TODO(INSERT) transfer from TSInsertTabletsReq to Statement
InsertRowsOfOneDeviceStatement statement =
(InsertRowsOfOneDeviceStatement) StatementGenerator.createStatement(req);
+ // return success when this statement is empty because server doesn't need to execute it
+ if (statement.isEmpty()) {
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ }
// permission check
TSStatus status = AuthorityChecker.checkAuthority(statement, req.sessionId);
@@ -873,6 +885,10 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
PathUtils.isLegalSingleMeasurements(req.getMeasurements());
InsertRowStatement statement = (InsertRowStatement) StatementGenerator.createStatement(req);
+ // return success when this statement is empty because server doesn't need to execute it
+ if (statement.isEmpty()) {
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ }
// permission check
TSStatus status = AuthorityChecker.checkAuthority(statement, req.sessionId);
@@ -915,6 +931,10 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
// Step 1: TODO(INSERT) transfer from TSInsertTabletsReq to Statement
InsertMultiTabletsStatement statement =
(InsertMultiTabletsStatement) StatementGenerator.createStatement(req);
+ // return success when this statement is empty because server doesn't need to execute it
+ if (statement.isEmpty()) {
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ }
// permission check
TSStatus status = AuthorityChecker.checkAuthority(statement, req.sessionId);
@@ -957,6 +977,10 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
// Step 1: TODO(INSERT) transfer from TSInsertTabletReq to Statement
InsertTabletStatement statement =
(InsertTabletStatement) StatementGenerator.createStatement(req);
+ // return success when this statement is empty because server doesn't need to execute it
+ if (statement.isEmpty()) {
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ }
// permission check
TSStatus status = AuthorityChecker.checkAuthority(statement, req.sessionId);
@@ -1006,6 +1030,10 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
PathUtils.isLegalSingleMeasurementLists(req.getMeasurementsList());
InsertRowsStatement statement = (InsertRowsStatement) StatementGenerator.createStatement(req);
+ // return success when this statement is empty because server doesn't need to execute it
+ if (statement.isEmpty()) {
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ }
// permission check
TSStatus status = AuthorityChecker.checkAuthority(statement, req.sessionId);