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

Reply via email to