This is an automated email from the ASF dual-hosted git repository.
CRZbulabula 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 3a06ed41d5d Disable multi-node REMOVE statements (#18360)
3a06ed41d5d is described below
commit 3a06ed41d5d1aeac44bfaaeb3cdfe744330d8403
Author: Yongzao <[email protected]>
AuthorDate: Thu Jul 30 16:00:04 2026 +0800
Disable multi-node REMOVE statements (#18360)
---
.../IoTDBRemoveDataNodeNormalIT.java | 7 ------
.../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 2 +-
.../db/queryengine/plan/parser/ASTVisitor.java | 3 +--
.../plan/relational/sql/parser/AstBuilder.java | 3 +--
...est.java => RemoveNodeSingleNodeParseTest.java} | 27 ++++++++++++----------
...java => RemoveNodeSingleNodeStatementTest.java} | 25 ++++++++++++--------
.../db/relational/grammar/sql/RelationalSql.g4 | 2 +-
7 files changed, 34 insertions(+), 35 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeNormalIT.java
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeNormalIT.java
index bf0a6ce5527..01eae1fb25d 100644
---
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeNormalIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeNormalIT.java
@@ -157,13 +157,6 @@ public class IoTDBRemoveDataNodeNormalIT {
successTest(2, 3, 1, 4, 1, 2, true, SQLModel.TABLE_MODEL_SQL,
ConsensusFactory.IOT_CONSENSUS);
}
- @Test
- public void success1C5DRemoveTwoDataNodesUseSQL() throws Exception {
- // Setup 1C5D, and remove 2D in a single "remove datanode a, b" statement;
3 DataNodes remain
- // which is enough to keep both the data (factor 2) and schema (factor 3)
replicas.
- successTest(2, 3, 1, 5, 2, 2, true, SQLModel.TREE_MODEL_SQL,
ConsensusFactory.IOT_CONSENSUS);
- }
-
// @Test
public void success1C4DIoTV2TestUseTableSQL() throws Exception {
// Setup 1C4D, and remove 1D, this test should success
diff --git
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index 5353535ad34..e2ae5144caf 100644
---
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -598,7 +598,7 @@ verifyConnection
// ---- Remove DataNode
removeDataNode
- : REMOVE DATANODE dataNodeIds+=INTEGER_LITERAL (COMMA
dataNodeIds+=INTEGER_LITERAL)*
+ : REMOVE DATANODE dataNodeId=INTEGER_LITERAL
;
// ---- Remove ConfigNode
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index 6ddd95593a1..e1ef66774f9 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -4704,8 +4704,7 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
@Override
public Statement visitRemoveDataNode(IoTDBSqlParser.RemoveDataNodeContext
ctx) {
- List<Integer> nodeIds =
- ctx.dataNodeIds.stream().map(token ->
Integer.parseInt(token.getText())).collect(toList());
+ List<Integer> nodeIds =
Collections.singletonList(Integer.parseInt(ctx.dataNodeId.getText()));
return new RemoveDataNodeStatement(nodeIds);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index 13ee006af76..7db81826ab6 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -1608,8 +1608,7 @@ public class AstBuilder extends
RelationalSqlBaseVisitor<Node> {
@Override
public Node
visitRemoveDataNodeStatement(RelationalSqlParser.RemoveDataNodeStatementContext
ctx) {
- List<Integer> nodeIds =
- ctx.dataNodeIds.stream().map(token ->
Integer.parseInt(token.getText())).collect(toList());
+ List<Integer> nodeIds =
Collections.singletonList(Integer.parseInt(ctx.dataNodeId.getText()));
return new RemoveDataNode(nodeIds);
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/RemoveDataNodeMultiNodeParseTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/RemoveNodeSingleNodeParseTest.java
similarity index 66%
rename from
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/RemoveDataNodeMultiNodeParseTest.java
rename to
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/RemoveNodeSingleNodeParseTest.java
index d71e4439045..ea67dcc48cf 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/RemoveDataNodeMultiNodeParseTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/RemoveNodeSingleNodeParseTest.java
@@ -20,22 +20,21 @@
package org.apache.iotdb.db.queryengine.plan.parser;
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
+import
org.apache.iotdb.db.queryengine.plan.statement.metadata.RemoveConfigNodeStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.RemoveDataNodeStatement;
+import org.antlr.v4.runtime.misc.ParseCancellationException;
import org.junit.Test;
import java.time.ZoneId;
-import java.util.Arrays;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
-/**
- * Parsing tests for the tree-model SQL that lets REMOVE DATANODE remove
multiple DataNodes in a
- * single statement.
- */
-public class RemoveDataNodeMultiNodeParseTest {
+/** Parsing tests for tree-model REMOVE DATANODE and REMOVE CONFIGNODE
statements. */
+public class RemoveNodeSingleNodeParseTest {
private static Statement parse(String sql) {
return StatementGenerator.createStatement(sql, ZoneId.systemDefault());
@@ -49,11 +48,15 @@ public class RemoveDataNodeMultiNodeParseTest {
}
@Test
- public void testRemoveMultipleDataNodes() {
- Statement statement = parse("remove datanode 3, 4, 5");
- assertTrue(statement instanceof RemoveDataNodeStatement);
- RemoveDataNodeStatement removeDataNodeStatement =
(RemoveDataNodeStatement) statement;
- assertEquals(3, removeDataNodeStatement.getNodeIds().size());
-
assertTrue(removeDataNodeStatement.getNodeIds().containsAll(Arrays.asList(3, 4,
5)));
+ public void testRemoveSingleConfigNode() {
+ Statement statement = parse("remove confignode 3");
+ assertTrue(statement instanceof RemoveConfigNodeStatement);
+ assertEquals(3, ((RemoveConfigNodeStatement)
statement).getNodeId().intValue());
+ }
+
+ @Test
+ public void testRejectRemovingMultipleNodes() {
+ assertThrows(ParseCancellationException.class, () -> parse("remove
datanode 3, 4"));
+ assertThrows(ParseCancellationException.class, () -> parse("remove
confignode 3, 4"));
}
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/RemoveDataNodeMultiNodeStatementTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/RemoveNodeSingleNodeStatementTest.java
similarity index 70%
rename from
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/RemoveDataNodeMultiNodeStatementTest.java
rename to
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/RemoveNodeSingleNodeStatementTest.java
index 06a794f2bdb..105457c4fca 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/RemoveDataNodeMultiNodeStatementTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/RemoveNodeSingleNodeStatementTest.java
@@ -20,25 +20,24 @@
package org.apache.iotdb.db.queryengine.plan.relational.sql.parser;
import org.apache.iotdb.commons.queryengine.plan.relational.sql.ast.Statement;
+import
org.apache.iotdb.commons.queryengine.plan.relational.sql.parser.ParsingException;
import org.apache.iotdb.db.protocol.session.IClientSession;
import org.apache.iotdb.db.protocol.session.InternalClientSession;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveConfigNode;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode;
import org.junit.Before;
import org.junit.Test;
import java.time.ZoneId;
-import java.util.Arrays;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
-/**
- * Parsing tests for the table-model SQL that lets REMOVE DATANODE remove
multiple DataNodes in a
- * single statement.
- */
-public class RemoveDataNodeMultiNodeStatementTest {
+/** Parsing tests for table-model REMOVE DATANODE and REMOVE CONFIGNODE
statements. */
+public class RemoveNodeSingleNodeStatementTest {
private SqlParser sqlParser;
private IClientSession clientSession;
@@ -61,9 +60,15 @@ public class RemoveDataNodeMultiNodeStatementTest {
}
@Test
- public void testRemoveMultipleDataNodes() {
- Statement statement = parse("remove datanode 3, 4, 5");
- assertTrue(statement instanceof RemoveDataNode);
- assertEquals(Arrays.asList(3, 4, 5), ((RemoveDataNode)
statement).getNodeIds());
+ public void testRemoveSingleConfigNode() {
+ Statement statement = parse("remove confignode 3");
+ assertTrue(statement instanceof RemoveConfigNode);
+ assertEquals(3, ((RemoveConfigNode) statement).getNodeId().intValue());
+ }
+
+ @Test
+ public void testRejectRemovingMultipleNodes() {
+ assertThrows(ParsingException.class, () -> parse("remove datanode 3, 4"));
+ assertThrows(ParsingException.class, () -> parse("remove confignode 3,
4"));
}
}
diff --git
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
index 6bebd2bc08e..e8e3c1937a7 100644
---
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
+++
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
@@ -660,7 +660,7 @@ removeRegionStatement
;
removeDataNodeStatement
- : REMOVE DATANODE dataNodeIds+=INTEGER_VALUE (','
dataNodeIds+=INTEGER_VALUE)*
+ : REMOVE DATANODE dataNodeId=INTEGER_VALUE
;
removeConfigNodeStatement