This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-27045 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 10b3738b7f51cee5d53634b611217e57f9c0783f Author: amashenkov <[email protected]> AuthorDate: Thu Nov 13 15:37:54 2025 +0300 wip --- .../sql/engine/exec/fsm/DdlBatchGroup.java | 4 +- .../sql/engine/sql/IgniteSqlDropIndex.java | 6 ++- .../internal/sql/engine/exec/DdlBatchingTest.java | 51 ++++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/fsm/DdlBatchGroup.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/fsm/DdlBatchGroup.java index 9dd5b09a555..216b4d70ad5 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/fsm/DdlBatchGroup.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/fsm/DdlBatchGroup.java @@ -25,7 +25,9 @@ package org.apache.ignite.internal.sql.engine.exec.fsm; public enum DdlBatchGroup { /** Group for CREATE operations. */ CREATE, - /** Group for DROP operations. */ + /** Group for DROP index operations. */ + DROP_INDEX, + /** Group for other DROP operations. */ DROP, /** Group for other DDL operations. */ OTHER; diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlDropIndex.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlDropIndex.java index f7a33fbcd47..5c20710a203 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlDropIndex.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlDropIndex.java @@ -35,7 +35,11 @@ import org.jetbrains.annotations.Nullable; /** * Parse tree for {@code DROP INDEX} statement. */ -@DdlBatchAware(group = DdlBatchGroup.DROP) +// Note: This operation changes index state for available indexes and can't be batched with DROP TABLE operations. +// Actually, this is a dirty hack, but it can and should be batched, but "voices in ones had" do NOT allow ignoring late event +// and objective reality, when the index has been dropped in the same batch as the table. However, the same "voices" are ok with ignoring +// errors, when the table is dropped concurrently with index purging process. +@DdlBatchAware(group = DdlBatchGroup.DROP_INDEX) public class IgniteSqlDropIndex extends SqlDrop { /** DROP INDEX operator. */ diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DdlBatchingTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DdlBatchingTest.java index bde3b3964cd..3be5cfac316 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DdlBatchingTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DdlBatchingTest.java @@ -283,6 +283,57 @@ public class DdlBatchingTest extends BaseIgniteAbstractTest { assertIndexNotExists("t1_ind_1"); } + @Test + void batchIsSplitByDropIndex() { + AsyncSqlCursor<InternalSqlRow> cursor = gatewayNode.executeQuery( + "CREATE TABLE t1 (id INT PRIMARY KEY, val_1 INT, val_2 INT);" + + "CREATE INDEX t1_ind_1 ON t1 (val_1);" + + "CREATE INDEX t1_ind_2 ON t1 (val_2);" + + "DROP INDEX t1_ind_1;" + + "DROP INDEX t1_ind_2;" + + "DROP TABLE t1;" + ); + + // CREATE TABLE t1 (id INT PRIMARY KEY, val_1 INT, val_2 INT) + assertDdlResult(cursor, true); + assertThat(cursor.hasNextResult(), is(true)); + assertThat(cursor.nextResult(), willSucceedFast()); + + // CREATE INDEX t1_ind_1 ON t1 (val_1) + cursor = cursor.nextResult().join(); + assertDdlResult(cursor, true); + assertThat(cursor.hasNextResult(), is(true)); + assertThat(cursor.nextResult(), willSucceedFast()); + + // CREATE INDEX t1_ind_2 ON t1 (val_2) + cursor = cursor.nextResult().join(); + assertDdlResult(cursor, true); + assertThat(cursor.hasNextResult(), is(true)); + assertThat(cursor.nextResult(), willSucceedFast()); + + // DROP INDEX t1_ind_1 + cursor = cursor.nextResult().join(); + assertDdlResult(cursor, true); + assertThat(cursor.hasNextResult(), is(true)); + assertThat(cursor.nextResult(), willSucceedFast()); + + // DROP INDEX t1_ind_1 + cursor = cursor.nextResult().join(); + assertDdlResult(cursor, true); + assertThat(cursor.hasNextResult(), is(true)); + assertThat(cursor.nextResult(), willSucceedFast()); + + // DROP TABLE t1 + cursor = cursor.nextResult().join(); + assertDdlResult(cursor, true); + assertThat(cursor.hasNextResult(), is(false)); + + assertEquals(3, executeCallCounter.get()); + assertTableNotExists("t1"); + assertIndexNotExists("t1_ind_1"); + assertIndexNotExists("t1_ind_2"); + } + @Test void batchIsSplitByOtherStatements() { AsyncSqlCursor<InternalSqlRow> cursor = gatewayNode.executeQuery(
