You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ko...@apache.org on 2023/09/05 10:14:07 UTC

[ignite-3] branch main updated: IGNITE-20307 Move handler of DropTable command from CatalogManager to command itself (#2526)

This is an automated email from the ASF dual-hosted git repository.

korlov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 73acf1841e IGNITE-20307 Move handler of DropTable command from CatalogManager to command itself (#2526)
73acf1841e is described below

commit 73acf1841eaede7931596af6124bdd3bb977a8aa
Author: korlov42 <ko...@gridgain.com>
AuthorDate: Tue Sep 5 13:14:01 2023 +0300

    IGNITE-20307 Move handler of DropTable command from CatalogManager to command itself (#2526)
---
 .../ignite/internal/catalog/CatalogCommand.java    |   6 +-
 .../ignite/internal/catalog/CatalogManager.java    |  29 +---
 .../internal/catalog/CatalogManagerImpl.java       |  58 +------
 .../catalog/CatalogParamsValidationUtils.java      |   5 -
 ....java => TableNotFoundValidationException.java} |   9 +-
 .../catalog/commands/AbstractTableCommand.java     |  46 +++++
 ...arams.java => AbstractTableCommandBuilder.java} |  30 ++--
 .../internal/catalog/commands/CatalogUtils.java    |  22 +++
 .../catalog/commands/CreateTableCommand.java       |  35 ++--
 .../commands/CreateTableCommandBuilder.java        |  12 +-
 .../catalog/commands/DropTableCommand.java         |  95 +++++++++++
 ...bleParams.java => DropTableCommandBuilder.java} |  25 +--
 .../internal/catalog/CatalogManagerSelfTest.java   |  34 +---
 .../catalog/CatalogManagerValidationTest.java      |   9 -
 .../commands/AbstractCommandValidationTest.java    | 106 ++++++++++++
 .../commands/CreateTableCommandValidationTest.java | 186 ++++++---------------
 .../commands/DropTableCommandValidationTest.java   |  99 +++++++++++
 .../internal/catalog/BaseCatalogManagerTest.java   |  11 +-
 .../engine/exec/ddl/DdlCommandHandlerWrapper.java  |  11 +-
 .../exec/ddl/DdlToCatalogCommandConverter.java     |  10 +-
 .../sql/engine/exec/MockedStructuresTest.java      |   3 -
 21 files changed, 500 insertions(+), 341 deletions(-)

diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
index 1c45724808..417dc9ca6b 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
@@ -17,10 +17,14 @@
 
 package org.apache.ignite.internal.catalog;
 
+import java.util.List;
+
 /**
  * Marker interface for commands executed by {@link CatalogManager}.
  *
  * @see CatalogManager#execute(CatalogCommand)
+ * @see CatalogManager#execute(List)
  */
-public interface CatalogCommand {
+@SuppressWarnings("InterfaceMayBeAnnotatedFunctional")
+public interface CatalogCommand extends UpdateProducer {
 }
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
index 3f292bbe3c..ca1d3d00a5 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
@@ -25,10 +25,8 @@ import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnParams;
 import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
 import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommandBuilder;
 import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
 import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.commands.DropZoneParams;
 import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
 import org.apache.ignite.internal.manager.IgniteComponent;
@@ -40,42 +38,19 @@ public interface CatalogManager extends IgniteComponent, CatalogService {
     /**
      * Executes given command.
      *
-     * <p>Accepts only those commands provided by builders returned by this very {@link CatalogManager}.
-     * Otherwise will throw {@link IllegalArgumentException}.
-     *
      * @param command Command to execute.
      * @return Future representing result of execution.
-     * @throws IllegalArgumentException If given command was created not by this manager.
-     * @see #createTableCommandBuilder()
      */
-    CompletableFuture<Void> execute(CatalogCommand command) throws IllegalArgumentException;
+    CompletableFuture<Void> execute(CatalogCommand command);
 
     /**
      * Executes given list of commands atomically. That is, either all commands will be applied at once
      * or neither of them. The whole bulk will increment catalog's version by a single point.
      *
-     * <p>Accepts only those commands provided by builders returned by this very {@link CatalogManager}.
-     * Otherwise will throw {@link IllegalArgumentException}.
-     *
      * @param commands Commands to execute.
      * @return Future representing result of execution.
-     * @throws IllegalArgumentException If given command was created not by this manager.
-     * @see #createTableCommandBuilder()
-     */
-    CompletableFuture<Void> execute(List<CatalogCommand> commands) throws IllegalArgumentException;
-
-    /**
-     * Returns builder to create a command to create a new table.
-     */
-    CreateTableCommandBuilder createTableCommandBuilder();
-
-    /**
-     * Drops table.
-     *
-     * @param params Parameters.
-     * @return Operation future.
      */
-    CompletableFuture<Void> dropTable(DropTableParams params);
+    CompletableFuture<Void> execute(List<CatalogCommand> commands);
 
     /**
      * Add columns to a table.
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
index 6f9efb0e6f..c126a817ed 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
@@ -28,7 +28,6 @@ import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.va
 import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateCreateZoneParams;
 import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropColumnParams;
 import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropIndexParams;
-import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropTableParams;
 import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropZoneParams;
 import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateRenameZoneParams;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.fromParams;
@@ -55,11 +54,8 @@ import org.apache.ignite.internal.catalog.commands.CatalogUtils;
 import org.apache.ignite.internal.catalog.commands.ColumnParams;
 import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommand;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommandBuilder;
 import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
 import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.commands.DropZoneParams;
 import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
 import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
@@ -75,7 +71,6 @@ import org.apache.ignite.internal.catalog.storage.AlterColumnEntry;
 import org.apache.ignite.internal.catalog.storage.AlterZoneEntry;
 import org.apache.ignite.internal.catalog.storage.DropColumnsEntry;
 import org.apache.ignite.internal.catalog.storage.DropIndexEntry;
-import org.apache.ignite.internal.catalog.storage.DropTableEntry;
 import org.apache.ignite.internal.catalog.storage.DropZoneEntry;
 import org.apache.ignite.internal.catalog.storage.Fireable;
 import org.apache.ignite.internal.catalog.storage.NewColumnsEntry;
@@ -313,53 +308,12 @@ public class CatalogManagerImpl extends Producer<CatalogEvent, CatalogEventParam
 
     @Override
     public CompletableFuture<Void> execute(CatalogCommand command) {
-        return saveUpdateAndWaitForActivation(toProducerOrThrow(command));
+        return saveUpdateAndWaitForActivation(command);
     }
 
     @Override
     public CompletableFuture<Void> execute(List<CatalogCommand> commands) throws IllegalArgumentException {
-        List<UpdateProducer> producers = new ArrayList<>(commands.size());
-
-        for (CatalogCommand command : commands) {
-            producers.add(toProducerOrThrow(command));
-        }
-
-        return saveUpdateAndWaitForActivation(new BulkUpdateProducer(producers));
-    }
-
-    private static UpdateProducer toProducerOrThrow(CatalogCommand command) {
-        if (!(command instanceof UpdateProducer)) {
-            throw new IllegalArgumentException("Expected command created by this very manager, but got "
-                    + (command == null ? "<null>" : command.getClass().getCanonicalName()));
-        }
-
-        return (UpdateProducer) command;
-    }
-
-    @Override
-    public CreateTableCommandBuilder createTableCommandBuilder() {
-        return new CreateTableCommand.Builder();
-    }
-
-    @Override
-    public CompletableFuture<Void> dropTable(DropTableParams params) {
-        return saveUpdateAndWaitForActivation(catalog -> {
-            validateDropTableParams(params);
-
-            CatalogSchemaDescriptor schema = getSchema(catalog, params.schemaName());
-
-            CatalogTableDescriptor table = getTable(schema, params.tableName());
-
-            List<UpdateEntry> updateEntries = new ArrayList<>();
-
-            Arrays.stream(schema.indexes())
-                    .filter(index -> index.tableId() == table.id())
-                    .forEach(index -> updateEntries.add(new DropIndexEntry(index.id(), index.tableId())));
-
-            updateEntries.add(new DropTableEntry(table.id()));
-
-            return updateEntries;
-        });
+        return saveUpdateAndWaitForActivation(new BulkUpdateProducer(List.copyOf(commands)));
     }
 
     @Override
@@ -856,17 +810,17 @@ public class CatalogManagerImpl extends Producer<CatalogEvent, CatalogEventParam
     }
 
     private static class BulkUpdateProducer implements UpdateProducer {
-        private final List<UpdateProducer> producers;
+        private final List<? extends UpdateProducer> commands;
 
-        BulkUpdateProducer(List<UpdateProducer> producers) {
-            this.producers = producers;
+        BulkUpdateProducer(List<? extends UpdateProducer> producers) {
+            this.commands = producers;
         }
 
         @Override
         public List<UpdateEntry> get(Catalog catalog) {
             List<UpdateEntry> bulkUpdateEntries = new ArrayList<>();
 
-            for (UpdateProducer producer : producers) {
+            for (UpdateProducer producer : commands) {
                 List<UpdateEntry> entries = producer.get(catalog);
 
                 for (UpdateEntry entry : entries) {
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
index ce65b53103..6b4c6de152 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
@@ -40,7 +40,6 @@ import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
 import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.commands.DropZoneParams;
 import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
 import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
@@ -120,10 +119,6 @@ public class CatalogParamsValidationUtils {
         validateZoneName(params.newZoneName(), "Missing new zone name");
     }
 
-    static void validateDropTableParams(DropTableParams params) {
-        validateCommonTableParams(params);
-    }
-
     static void validateDropColumnParams(AlterTableDropColumnParams params) {
         validateCommonTableParams(params);
 
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/TableNotFoundValidationException.java
similarity index 71%
copy from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
copy to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/TableNotFoundValidationException.java
index 1c45724808..6a1e6cec7e 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogCommand.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/TableNotFoundValidationException.java
@@ -18,9 +18,12 @@
 package org.apache.ignite.internal.catalog;
 
 /**
- * Marker interface for commands executed by {@link CatalogManager}.
+ * This exception is thrown when table that going to be deleted not found in the schema.
  *
- * @see CatalogManager#execute(CatalogCommand)
+ * <p>This exception is used to properly handle IF EXISTS flag in ddl command handler.
  */
-public interface CatalogCommand {
+public class TableNotFoundValidationException extends CatalogValidationException {
+    public TableNotFoundValidationException(String message) {
+        super(message);
+    }
 }
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommand.java
new file mode 100644
index 0000000000..e0887ca70e
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommand.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateIdentifier;
+
+import org.apache.ignite.internal.catalog.CatalogValidationException;
+
+/**
+ * Abstract table-related command.
+ *
+ * <p>Every table-related command, disregard it going to create new table or modify existing one,
+ * should specify name of the table and namespace (schema) where to find existing/put new table.
+ */
+public abstract class AbstractTableCommand extends AbstractCatalogCommand {
+    protected final String schemaName;
+
+    protected final String tableName;
+
+    AbstractTableCommand(String schemaName, String tableName) throws CatalogValidationException {
+        this.schemaName = schemaName;
+        this.tableName = tableName;
+
+        validate();
+    }
+
+    private void validate() {
+        validateIdentifier(schemaName, "Name of the schema");
+        validateIdentifier(tableName, "Name of the table");
+    }
+}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandBuilder.java
similarity index 55%
copy from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
copy to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandBuilder.java
index 9ae34f7d20..9de2e867d7 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractTableCommandBuilder.java
@@ -17,21 +17,21 @@
 
 package org.apache.ignite.internal.catalog.commands;
 
-/** DROP TABLE statement. */
-public class DropTableParams extends AbstractTableCommandParams {
-    /** Creates parameters builder. */
-    public static Builder builder() {
-        return new Builder();
-    }
+import org.apache.ignite.internal.catalog.CatalogCommand;
 
-    private DropTableParams() {
-        // No-op.
-    }
+/**
+ * Abstract builder of table-related commands.
+ *
+ * <p>Every table-related command, disregard it going to create new table or modify existing one,
+ * should specify name of the table and namespace (schema) where to find existing/put new table.
+ */
+public interface AbstractTableCommandBuilder<T extends AbstractTableCommandBuilder<T>> {
+    /** A name of the schema a table belongs to. Should not be null or blank. */
+    T schemaName(String schemaName);
+
+    /** A name of the table. Should not be null or blank. */
+    T tableName(String tableName);
 
-    /** Parameters builder. */
-    public static class Builder extends AbstractTableBuilder<DropTableParams, Builder> {
-        private Builder() {
-            super(new DropTableParams());
-        }
-    }
+    /** Returns a command with specified parameters. */
+    CatalogCommand build();
 }
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index 63fcc508c5..d1f753ead5 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import java.util.stream.IntStream;
 import org.apache.ignite.internal.catalog.Catalog;
 import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.apache.ignite.internal.catalog.TableNotFoundValidationException;
 import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
 import org.apache.ignite.internal.catalog.descriptors.CatalogDataStorageDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
@@ -36,6 +37,7 @@ import org.apache.ignite.internal.catalog.descriptors.CatalogIndexColumnDescript
 import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.sql.ColumnType;
 import org.jetbrains.annotations.Nullable;
@@ -357,6 +359,26 @@ public class CatalogUtils {
         return schema;
     }
 
+    /**
+     * Returns table with given name, or throws {@link TableNotFoundValidationException} if table with given name not exists.
+     *
+     * @param schema Schema to look up table in.
+     * @param name Name of the table of interest.
+     * @return Table with given name. Never null.
+     * @throws TableNotFoundValidationException If table with given name is not exists.
+     */
+    static CatalogTableDescriptor tableOrThrow(CatalogSchemaDescriptor schema, String name) throws TableNotFoundValidationException {
+        name = Objects.requireNonNull(name, "tableName");
+
+        CatalogTableDescriptor table = schema.table(name);
+
+        if (table == null) {
+            throw new TableNotFoundValidationException(format("Table with name '{}.{}' not found", schema.name(), name));
+        }
+
+        return table;
+    }
+
     /**
      * Returns zone with given name, or throws {@link CatalogValidationException} if zone with given name not exists.
      *
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
index 93e6f9a035..25f17d3671 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommand.java
@@ -21,7 +21,6 @@ import static java.util.Objects.requireNonNullElse;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.ensureNoTableOrIndexExistsWithGivenName;
 import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateColumnParams;
-import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateIdentifier;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.schemaOrThrow;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.zoneOrThrow;
 import static org.apache.ignite.internal.util.CollectionUtils.copyOrNull;
@@ -43,17 +42,15 @@ import org.apache.ignite.internal.catalog.storage.NewIndexEntry;
 import org.apache.ignite.internal.catalog.storage.NewTableEntry;
 import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
 import org.apache.ignite.internal.catalog.storage.UpdateEntry;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * A command that adds a new table to the catalog.
  */
-public class CreateTableCommand extends AbstractCatalogCommand {
-    /** Schema name where this new table will be created. */
-    private final String schemaName;
-
-    /** Table name. */
-    private final String tableName;
+public class CreateTableCommand extends AbstractTableCommand {
+    /** Returns builder to create a command to create a new table. */
+    public static CreateTableCommandBuilder builder() {
+        return new Builder();
+    }
 
     /** Primary key columns. */
     private final List<String> primaryKeyColumns;
@@ -88,8 +85,8 @@ public class CreateTableCommand extends AbstractCatalogCommand {
             List<ColumnParams> columns,
             String zoneName
     ) throws CatalogValidationException {
-        this.tableName = tableName;
-        this.schemaName = schemaName;
+        super(schemaName, tableName);
+
         this.primaryKeyColumns = copyOrNull(primaryKeyColumns);
         this.colocationColumns = copyOrNull(colocationColumns);
         this.columns = copyOrNull(columns);
@@ -140,9 +137,6 @@ public class CreateTableCommand extends AbstractCatalogCommand {
     }
 
     private void validate() {
-        validateIdentifier(schemaName, "Name of the schema");
-        validateIdentifier(tableName, "Name of the table");
-
         if (nullOrEmpty(columns)) {
             throw new CatalogValidationException("Table should have at least one column");
         }
@@ -193,18 +187,18 @@ public class CreateTableCommand extends AbstractCatalogCommand {
     /**
      * Implementation of {@link CreateTableCommandBuilder}.
      */
-    public static class Builder implements CreateTableCommandBuilder {
-        private @Nullable List<ColumnParams> columns;
+    private static class Builder implements CreateTableCommandBuilder {
+        private List<ColumnParams> columns;
 
-        private @Nullable String schemaName;
+        private String schemaName;
 
-        private @Nullable String tableName;
+        private String tableName;
 
-        private @Nullable List<String> primaryKeyColumns;
+        private List<String> primaryKeyColumns;
 
-        private @Nullable List<String> colocationColumns;
+        private List<String> colocationColumns;
 
-        private @Nullable String zoneName;
+        private String zoneName;
 
         @Override
         public CreateTableCommandBuilder schemaName(String schemaName) {
@@ -248,7 +242,6 @@ public class CreateTableCommand extends AbstractCatalogCommand {
             return this;
         }
 
-        @SuppressWarnings("DataFlowIssue") // params are validated in constructor
         @Override
         public CatalogCommand build() {
             String zoneName = requireNonNullElse(this.zoneName, CatalogService.DEFAULT_ZONE_NAME);
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java
index 31cc55a2cd..c9eaaa54a9 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandBuilder.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.catalog.commands;
 
 import java.util.List;
-import org.apache.ignite.internal.catalog.CatalogCommand;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -28,13 +27,7 @@ import org.jetbrains.annotations.Nullable;
  * to make sure invocation of {@link #build()} method doesn't cause any
  * side effects on builder's state or any object created by the same builder.
  */
-public interface CreateTableCommandBuilder {
-    /** A name of the schema to add new table to. Should not be null or blank. */
-    CreateTableCommandBuilder schemaName(String schemaName);
-
-    /** A name of the table to add. Should not be null or blank. */
-    CreateTableCommandBuilder tableName(String tableName);
-
+public interface CreateTableCommandBuilder extends AbstractTableCommandBuilder<CreateTableCommandBuilder> {
     /** List of columns a new table should be created with. There must be at least one column. */
     CreateTableCommandBuilder columns(List<ColumnParams> columns);
 
@@ -52,7 +45,4 @@ public interface CreateTableCommandBuilder {
 
     /** A name of the zone to create new table in. Should not be null or blank. */
     CreateTableCommandBuilder zone(@Nullable String zoneName);
-
-    /** Returns a command with specified parameters. */
-    CatalogCommand build();
 }
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommand.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommand.java
new file mode 100644
index 0000000000..de01a40a3d
--- /dev/null
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommand.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.internal.catalog.commands.CatalogUtils.schemaOrThrow;
+import static org.apache.ignite.internal.catalog.commands.CatalogUtils.tableOrThrow;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogCommand;
+import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
+import org.apache.ignite.internal.catalog.storage.DropIndexEntry;
+import org.apache.ignite.internal.catalog.storage.DropTableEntry;
+import org.apache.ignite.internal.catalog.storage.UpdateEntry;
+
+/**
+ * A command that drops table with specified name.
+ */
+public class DropTableCommand extends AbstractTableCommand {
+    /** Returns builder to create a command to drop table with specified name. */
+    public static DropTableCommandBuilder builder() {
+        return new Builder();
+    }
+
+    private DropTableCommand(String schemaName, String tableName) throws CatalogValidationException {
+        super(schemaName, tableName);
+    }
+
+    @Override
+    public List<UpdateEntry> get(Catalog catalog) {
+        CatalogSchemaDescriptor schema = schemaOrThrow(catalog, schemaName);
+
+        CatalogTableDescriptor table = tableOrThrow(schema, tableName);
+
+        List<UpdateEntry> updateEntries = new ArrayList<>();
+
+        Arrays.stream(schema.indexes())
+                .filter(index -> index.tableId() == table.id())
+                .forEach(index -> updateEntries.add(new DropIndexEntry(index.id(), index.tableId())));
+
+        updateEntries.add(new DropTableEntry(table.id()));
+
+        return updateEntries;
+    }
+
+    /**
+     * Implementation of {@link DropTableCommandBuilder}.
+     */
+    private static class Builder implements DropTableCommandBuilder {
+        private String schemaName;
+
+        private String tableName;
+
+        @Override
+        public DropTableCommandBuilder schemaName(String schemaName) {
+            this.schemaName = schemaName;
+
+            return this;
+        }
+
+        @Override
+        public DropTableCommandBuilder tableName(String tableName) {
+            this.tableName = tableName;
+
+            return this;
+        }
+
+        @Override
+        public CatalogCommand build() {
+            return new DropTableCommand(
+                    schemaName,
+                    tableName
+            );
+        }
+    }
+}
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommandBuilder.java
similarity index 64%
rename from modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
rename to modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommandBuilder.java
index 9ae34f7d20..9a154d8935 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableParams.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropTableCommandBuilder.java
@@ -17,21 +17,12 @@
 
 package org.apache.ignite.internal.catalog.commands;
 
-/** DROP TABLE statement. */
-public class DropTableParams extends AbstractTableCommandParams {
-    /** Creates parameters builder. */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    private DropTableParams() {
-        // No-op.
-    }
-
-    /** Parameters builder. */
-    public static class Builder extends AbstractTableBuilder<DropTableParams, Builder> {
-        private Builder() {
-            super(new DropTableParams());
-        }
-    }
+/**
+ * Builder of a command that drop specified table.
+ *
+ * <p>A builder is considered to be reusable, thus implementation have
+ * to make sure invocation of {@link #build()} method doesn't cause any
+ * side effects on builder's state or any object created by the same builder.
+ */
+public interface DropTableCommandBuilder extends AbstractTableCommandBuilder<DropTableCommandBuilder> {
 }
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
index 23239c547f..dff338ae27 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
@@ -273,7 +273,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
 
         long beforeDropTimestamp = clock.nowLong();
 
-        assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+        assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
 
         // Validate catalog version from the past.
         CatalogSchemaDescriptor schema = manager.schema(2);
@@ -820,7 +820,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
 
         long beforeDropTimestamp = clock.nowLong();
 
-        assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+        assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
 
         // Validate catalog version from the past.
         CatalogSchemaDescriptor schema = manager.schema(2);
@@ -1019,7 +1019,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
         assertThat(manager.execute(simpleTable(TABLE_NAME)), willBe(nullValue()));
         verify(eventListener).notify(any(CreateTableEventParameters.class), isNull());
 
-        assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+        assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
         verify(eventListener).notify(any(DropTableEventParameters.class), isNull());
 
         verifyNoMoreInteractions(eventListener);
@@ -1060,7 +1060,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
         clearInvocations(eventListener);
 
         // Drop table with pk index.
-        assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+        assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
 
         // Try drop index once again.
         assertThat(manager.dropIndex(dropIndexParams), willThrow(IndexNotFoundException.class));
@@ -1447,7 +1447,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
         assertEquals(tableId, eventParameters.tableId());
 
         // Let's delete the table.
-        assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willBe(nullValue()));
+        assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willBe(nullValue()));
 
         // Let's make sure that the PK index has been deleted.
         eventParameters = captor.getValue();
@@ -1634,7 +1634,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
 
     @Test
     void testDropNotExistingTable() {
-        assertThat(manager.dropTable(dropTableParams(TABLE_NAME)), willThrowFast(TableNotFoundException.class));
+        assertThat(manager.execute(dropTableCommand(TABLE_NAME)), willThrowFast(CatalogValidationException.class));
     }
 
     @Test
@@ -1697,28 +1697,6 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
         );
     }
 
-    @Test
-    void exceptionIsThrownIfCommandIsUnknown() {
-        CatalogCommand command = new CatalogCommand() {
-        };
-
-        assertThrows(
-                IllegalArgumentException.class,
-                () -> manager.execute(command)
-        );
-
-        assertThrows(
-                IllegalArgumentException.class,
-                () -> manager.execute(List.of(
-                        simpleTable("T1"),
-                        simpleTable("T2"),
-                        simpleTable("T3"),
-                        command,
-                        simpleTable("T4")
-                ))
-        );
-    }
-
     @Test
     void bulkCommandEitherAppliedAtomicallyOrDoesntAppliedAtAll() {
         String tableName1 = "TEST1";
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
index 9efdb4e941..7da0846ac8 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
@@ -44,7 +44,6 @@ import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
 import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.commands.DropZoneParams;
 import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
 import org.jetbrains.annotations.Nullable;
@@ -661,14 +660,6 @@ public class CatalogManagerValidationTest extends BaseCatalogManagerTest {
         );
     }
 
-    @Test
-    void testValidateTableNameOnTableDrop() {
-        assertThat(
-                manager.dropTable(DropTableParams.builder().build()),
-                willThrowFast(CatalogValidationException.class, "Name of the table can't be null or blank")
-        );
-    }
-
     @Test
     void testValidateTableNameOnDropColumn() {
         assertThat(
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
new file mode 100644
index 0000000000..773cab510c
--- /dev/null
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.sql.ColumnType.INT32;
+import static org.mockito.Mockito.mock;
+
+import java.util.List;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.CatalogManagerImpl;
+import org.apache.ignite.internal.catalog.ClockWaiter;
+import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.storage.UpdateLog;
+import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.junit.jupiter.params.provider.Arguments;
+
+/**
+ * Abstract test class for all command-related validation tests.
+ *
+ * <p>Provides a convenient set of utility methods to reuse in test.
+ */
+abstract class AbstractCommandValidationTest extends BaseIgniteAbstractTest {
+    static final String SCHEMA_NAME = "PUBLIC";
+    static final String ZONE_NAME = "DEFAULT";
+
+    private static final CatalogZoneDescriptor DEFAULT_ZONE = new CatalogZoneDescriptor(
+            0, ZONE_NAME, 1, -1, -1, -1, -1, "", null
+    );
+
+    final CatalogManager manager = new CatalogManagerImpl(
+            mock(UpdateLog.class),
+            mock(ClockWaiter.class)
+    );
+
+    static Stream<Arguments> nullAndBlankStrings() {
+        return Stream.of(null, "", " ", "  ").map(Arguments::of);
+    }
+
+    static Stream<Arguments> nullAndEmptyLists() {
+        return Stream.of(null, List.of()).map(Arguments::of);
+    }
+
+    static Catalog emptyCatalog() {
+        return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[0]);
+    }
+
+    static Catalog catalogWithTable(String name) {
+        int tableId = 0;
+        int tableVersion = 1;
+        int zoneId = 0;
+        List<CatalogTableColumnDescriptor> columns = List.of(
+                new CatalogTableColumnDescriptor("C", INT32, false, -1, -1, -1, null)
+        );
+        List<String> pkColumns = List.of("C");
+
+        CatalogTableDescriptor table = new CatalogTableDescriptor(
+                tableId, name, zoneId, tableVersion, columns, pkColumns, pkColumns
+        );
+
+        return catalog(new CatalogTableDescriptor[]{table}, new CatalogIndexDescriptor[0]);
+    }
+
+    static Catalog catalogWithIndex(String name) {
+        CatalogIndexDescriptor index = new CatalogHashIndexDescriptor(
+                0, name, 0, false, List.of("C"));
+
+        return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[]{index});
+    }
+
+    private static Catalog catalog(CatalogTableDescriptor[] tables, CatalogIndexDescriptor[] indexes) {
+        return new Catalog(
+                1,
+                0L,
+                1,
+                List.of(DEFAULT_ZONE),
+                List.of(new CatalogSchemaDescriptor(
+                        0,
+                        SCHEMA_NAME,
+                        tables,
+                        indexes
+                ))
+        );
+    }
+}
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
index 27be45bf7f..7ca8eb3fd2 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateTableCommandValidationTest.java
@@ -17,69 +17,34 @@
 
 package org.apache.ignite.internal.catalog.commands;
 
+import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.sql.ColumnType.INT32;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
 
 import java.util.List;
-import java.util.stream.Stream;
 import org.apache.ignite.internal.catalog.Catalog;
-import org.apache.ignite.internal.catalog.CatalogManager;
-import org.apache.ignite.internal.catalog.CatalogManagerImpl;
+import org.apache.ignite.internal.catalog.CatalogCommand;
 import org.apache.ignite.internal.catalog.CatalogValidationException;
-import org.apache.ignite.internal.catalog.ClockWaiter;
-import org.apache.ignite.internal.catalog.UpdateProducer;
-import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
-import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
-import org.apache.ignite.internal.catalog.storage.UpdateLog;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
-import org.apache.ignite.internal.testframework.IgniteTestUtils.RunnableX;
-import org.hamcrest.Matchers;
-import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 /**
  * Tests to verify validation of {@link CreateTableCommand}.
  */
-@SuppressWarnings("DataFlowIssue")
-public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
-    private static final String SCHEMA_NAME = "PUBLIC";
-    private static final String ZONE_NAME = "DEFAULT";
-
-    private static final CatalogZoneDescriptor DEFAULT_ZONE = new CatalogZoneDescriptor(
-            0, ZONE_NAME, 1, -1, -1, -1, -1, "", null
-    );
-
-    private final CatalogManager manager = new CatalogManagerImpl(
-            mock(UpdateLog.class),
-            mock(ClockWaiter.class)
-    );
-
-    private static Stream<Arguments> nullAndBlankStrings() {
-        return Stream.of(null, "", " ", "  ").map(Arguments::of);
-    }
+@SuppressWarnings({"DataFlowIssue", "ThrowableNotThrown"})
+public class CreateTableCommandValidationTest extends AbstractCommandValidationTest {
 
-    private static Stream<Arguments> nullAndEmptyLists() {
-        return Stream.of(null, List.of()).map(Arguments::of);
-    }
 
     @ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
     @MethodSource("nullAndBlankStrings")
     void schemaNameMustNotBeNullOrBlank(String name) {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder);
 
         builder.schemaName(name);
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Name of the schema can't be null or blank"
@@ -89,13 +54,13 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
     @ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
     @MethodSource("nullAndBlankStrings")
     void tableNameMustNotBeNullOrBlank(String name) {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder);
 
         builder.tableName(name);
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Name of the table can't be null or blank"
@@ -105,13 +70,13 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
     @ParameterizedTest(name = "[{index}] {argumentsWithNames}")
     @MethodSource("nullAndEmptyLists")
     void tableShouldHaveAtLeastOneColumn(List<ColumnParams> columns) {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder);
 
         builder.columns(columns);
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Table should have at least one column"
@@ -121,7 +86,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
     @ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
     @MethodSource("nullAndBlankStrings")
     void tableColumnNameMustNotBeNullOrBlank(String name) {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder);
 
@@ -129,7 +94,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
                 ColumnParams.builder().name(name).build()
         ));
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Name of the column can't be null or blank"
@@ -138,7 +103,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void tableColumnShouldHaveType() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder)
                 .columns(List.of(
@@ -148,7 +113,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
                                 .build()
                 ));
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Missing column type: C"
@@ -157,7 +122,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void columnShouldNotHaveDuplicates() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         ColumnParams column = ColumnParams.builder()
                 .name("C")
@@ -166,7 +131,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
         builder = fillProperties(builder).columns(List.of(column, column));
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Column with name 'C' specified more than once"
@@ -176,13 +141,13 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
     @ParameterizedTest(name = "[{index}] {argumentsWithNames}")
     @MethodSource("nullAndEmptyLists")
     void tableShouldHaveAtLeastOnePrimaryKeyColumn(List<String> columns) {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder);
 
         builder.primaryKeyColumns(columns);
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Table should have primary key"
@@ -191,12 +156,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void pkColumnShouldNotHaveDuplicates() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder)
                 .primaryKeyColumns(List.of("C", "C"));
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "PK column 'C' specified more that once"
@@ -205,12 +170,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void pkColumnShouldBePresentedInColumnsList() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder)
                 .primaryKeyColumns(List.of("foo"));
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "PK column 'foo' is not part of table"
@@ -219,12 +184,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void colocationColumnsCouldNotBeEmpty() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder)
                 .colocationColumns(List.of());
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Colocation columns could not be empty"
@@ -233,12 +198,12 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void colocationColumnShouldNotHaveDuplicates() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         builder = fillProperties(builder)
                 .colocationColumns(List.of("C", "C"));
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Colocation column 'C' specified more that once"
@@ -247,7 +212,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void colocationColumnShouldBePresentedInColumnsList() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         ColumnParams c1 = ColumnParams.builder()
                 .name("C1")
@@ -264,7 +229,7 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
                 .primaryKeyColumns(List.of("C1"))
                 .colocationColumns(List.of("C2"));
 
-        assertThrows(
+        assertThrowsWithCause(
                 builder::build,
                 CatalogValidationException.class,
                 "Colocation column 'C2' is not part of PK"
@@ -288,14 +253,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void exceptionIsThrownIfSchemaNotExists() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         Catalog catalog = emptyCatalog();
 
-        UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).schemaName(SCHEMA_NAME + "_UNK").build();
+        CatalogCommand command = fillProperties(builder).schemaName(SCHEMA_NAME + "_UNK").build();
 
-        assertThrows(
-                () -> updateProducer.get(catalog),
+        assertThrowsWithCause(
+                () -> command.get(catalog),
                 CatalogValidationException.class,
                 "Schema with name 'PUBLIC_UNK' not found"
         );
@@ -303,14 +268,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void exceptionIsThrownIfZoneNotExists() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         Catalog catalog = emptyCatalog();
 
-        UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).zone(ZONE_NAME + "_UNK").build();
+        CatalogCommand command = fillProperties(builder).zone(ZONE_NAME + "_UNK").build();
 
-        assertThrows(
-                () -> updateProducer.get(catalog),
+        assertThrowsWithCause(
+                () -> command.get(catalog),
                 CatalogValidationException.class,
                 "Distribution zone with name 'DEFAULT_UNK' not found"
         );
@@ -318,14 +283,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void exceptionIsThrownIfTableWithGivenNameAlreadyExists() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         Catalog catalog = catalogWithTable("TEST");
 
-        UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+        CatalogCommand command = fillProperties(builder).tableName("TEST").build();
 
-        assertThrows(
-                () -> updateProducer.get(catalog),
+        assertThrowsWithCause(
+                () -> command.get(catalog),
                 CatalogValidationException.class,
                 "Table with name 'PUBLIC.TEST' already exists"
         );
@@ -333,14 +298,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void exceptionIsThrownIfIndexWithGivenNameAlreadyExists() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         Catalog catalog = catalogWithIndex("TEST");
 
-        UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+        CatalogCommand command = fillProperties(builder).tableName("TEST").build();
 
-        assertThrows(
-                () -> updateProducer.get(catalog),
+        assertThrowsWithCause(
+                () -> command.get(catalog),
                 CatalogValidationException.class,
                 "Index with name 'PUBLIC.TEST' already exists"
         );
@@ -348,14 +313,14 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void exceptionIsThrownIfTableWithNameSimilarToAutogeneratedPkNameAlreadyExists() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         Catalog catalog = catalogWithTable("TEST_PK");
 
-        UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+        CatalogCommand command = fillProperties(builder).tableName("TEST").build();
 
-        assertThrows(
-                () -> updateProducer.get(catalog),
+        assertThrowsWithCause(
+                () -> command.get(catalog),
                 CatalogValidationException.class,
                 "Table with name 'PUBLIC.TEST_PK' already exists"
         );
@@ -363,63 +328,16 @@ public class CreateTableCommandValidationTest extends BaseIgniteAbstractTest {
 
     @Test
     void exceptionIsThrownIfIndexWithNameSimilarToAutogeneratedPkNameAlreadyExists() {
-        CreateTableCommandBuilder builder = manager.createTableCommandBuilder();
+        CreateTableCommandBuilder builder = CreateTableCommand.builder();
 
         Catalog catalog = catalogWithIndex("TEST_PK");
 
-        UpdateProducer updateProducer = (UpdateProducer) fillProperties(builder).tableName("TEST").build();
+        CatalogCommand command = fillProperties(builder).tableName("TEST").build();
 
-        assertThrows(
-                () -> updateProducer.get(catalog),
+        assertThrowsWithCause(
+                () -> command.get(catalog),
                 CatalogValidationException.class,
                 "Index with name 'PUBLIC.TEST_PK' already exists"
         );
     }
-
-    private static <T extends Throwable> void assertThrows(RunnableX runnable, Class<T> expectedType, String message) {
-        T ex = Assertions.assertThrows(
-                expectedType,
-                runnable::run
-        );
-
-        assertThat(
-                ex.getMessage(),
-                Matchers.containsString(message)
-        );
-    }
-
-    private static Catalog emptyCatalog() {
-        return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[0]);
-    }
-
-    private static Catalog catalogWithTable(String name) {
-        CatalogTableDescriptor table = new CatalogTableDescriptor(
-                0, name, 0, 1, List.of(
-                        new CatalogTableColumnDescriptor("C", INT32, false, -1, -1, -1, null)
-        ), List.of("C"), List.of("C"));
-
-        return catalog(new CatalogTableDescriptor[]{table}, new CatalogIndexDescriptor[0]);
-    }
-
-    private static Catalog catalogWithIndex(String name) {
-        CatalogIndexDescriptor index = new CatalogHashIndexDescriptor(
-                0, name, 0, false, List.of("C"));
-
-        return catalog(new CatalogTableDescriptor[0], new CatalogIndexDescriptor[]{index});
-    }
-
-    private static Catalog catalog(CatalogTableDescriptor[] tables, CatalogIndexDescriptor[] indexes) {
-        return new Catalog(
-                1,
-                0L,
-                1,
-                List.of(DEFAULT_ZONE),
-                List.of(new CatalogSchemaDescriptor(
-                        0,
-                        SCHEMA_NAME,
-                        tables,
-                        indexes
-                ))
-        );
-    }
 }
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/DropTableCommandValidationTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/DropTableCommandValidationTest.java
new file mode 100644
index 0000000000..697f343289
--- /dev/null
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/DropTableCommandValidationTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog.commands;
+
+import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
+
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogCommand;
+import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+/**
+ * Tests to verify validation of {@link DropTableCommand}.
+ */
+@SuppressWarnings("ThrowableNotThrown")
+public class DropTableCommandValidationTest extends AbstractCommandValidationTest {
+    @ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
+    @MethodSource("nullAndBlankStrings")
+    void schemaNameMustNotBeNullOrBlank(String name) {
+        DropTableCommandBuilder builder = DropTableCommand.builder();
+
+        builder.tableName("TEST")
+                .schemaName(name);
+
+        assertThrowsWithCause(
+                builder::build,
+                CatalogValidationException.class,
+                "Name of the schema can't be null or blank"
+        );
+    }
+
+    @ParameterizedTest(name = "[{index}] ''{argumentsWithNames}''")
+    @MethodSource("nullAndBlankStrings")
+    void tableNameMustNotBeNullOrBlank(String name) {
+        DropTableCommandBuilder builder = DropTableCommand.builder();
+
+        builder.schemaName("TEST")
+                .tableName(name);
+
+        assertThrowsWithCause(
+                builder::build,
+                CatalogValidationException.class,
+                "Name of the table can't be null or blank"
+        );
+    }
+
+    @Test
+    void exceptionIsThrownIfSchemaNotExists() {
+        DropTableCommandBuilder builder = DropTableCommand.builder();
+
+        Catalog catalog = emptyCatalog();
+
+        CatalogCommand command = builder
+                .schemaName(SCHEMA_NAME + "_UNK")
+                .tableName("TEST")
+                .build();
+
+        assertThrowsWithCause(
+                () -> command.get(catalog),
+                CatalogValidationException.class,
+                "Schema with name 'PUBLIC_UNK' not found"
+        );
+    }
+
+    @Test
+    void exceptionIsThrownIfTableWithGivenNameNotFound() {
+        DropTableCommandBuilder builder = DropTableCommand.builder();
+
+        Catalog catalog = emptyCatalog();
+
+        CatalogCommand command = builder
+                .schemaName(SCHEMA_NAME)
+                .tableName("TEST")
+                .build();
+
+        assertThrowsWithCause(
+                () -> command.get(catalog),
+                CatalogValidationException.class,
+                "Table with name 'PUBLIC.TEST' not found"
+        );
+    }
+}
diff --git a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
index 91838a6255..c48b1b7fe1 100644
--- a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
+++ b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
@@ -32,7 +32,8 @@ import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnParams;
 import org.apache.ignite.internal.catalog.commands.ColumnParams;
 import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
+import org.apache.ignite.internal.catalog.commands.CreateTableCommand;
+import org.apache.ignite.internal.catalog.commands.DropTableCommand;
 import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
 import org.apache.ignite.internal.catalog.storage.UpdateLog;
 import org.apache.ignite.internal.catalog.storage.UpdateLogImpl;
@@ -157,13 +158,13 @@ public abstract class BaseCatalogManagerTest extends BaseIgniteAbstractTest {
         return createSortedIndexParams(indexName, false, indexColumns, columnsCollations);
     }
 
-    protected CatalogCommand createTableCommand(
+    protected static CatalogCommand createTableCommand(
             String tableName,
             List<ColumnParams> columns,
             List<String> primaryKeys,
             @Nullable List<String> colocationColumns
     ) {
-        return manager.createTableCommandBuilder()
+        return CreateTableCommand.builder()
                 .schemaName(DEFAULT_SCHEMA_NAME)
                 .zone(DEFAULT_ZONE_NAME)
                 .tableName(tableName)
@@ -189,8 +190,8 @@ public abstract class BaseCatalogManagerTest extends BaseIgniteAbstractTest {
         return ColumnParams.builder().name(name).nullable(nullable).type(type);
     }
 
-    protected static DropTableParams dropTableParams(String tableName) {
-        return DropTableParams.builder().schemaName(DEFAULT_SCHEMA_NAME).tableName(tableName).build();
+    protected static CatalogCommand dropTableCommand(String tableName) {
+        return DropTableCommand.builder().schemaName(DEFAULT_SCHEMA_NAME).tableName(tableName).build();
     }
 
     protected static AlterTableDropColumnParams dropColumnParams(String... columns) {
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
index 8b79563743..6f67d6f08e 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
@@ -21,6 +21,7 @@ import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.catalog.CatalogManager;
 import org.apache.ignite.internal.catalog.TableExistsValidationException;
+import org.apache.ignite.internal.catalog.TableNotFoundValidationException;
 import org.apache.ignite.internal.catalog.commands.AbstractCreateIndexCommandParams;
 import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
@@ -80,15 +81,17 @@ public class DdlCommandHandlerWrapper extends DdlCommandHandler {
         if (cmd instanceof CreateTableCommand) {
             return ddlCommandFuture
                     .thenCompose(res -> catalogManager.execute(
-                            DdlToCatalogCommandConverter.convert(catalogManager.createTableCommandBuilder(), (CreateTableCommand) cmd))
+                            DdlToCatalogCommandConverter.convert((CreateTableCommand) cmd))
                             .handle(handleModificationResult(
                                     ((CreateTableCommand) cmd).ifTableExists(), TableExistsValidationException.class))
                     ).handle(handleModificationResult(((CreateTableCommand) cmd).ifTableExists(), TableAlreadyExistsException.class));
         } else if (cmd instanceof DropTableCommand) {
             return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.dropTable(DdlToCatalogCommandConverter.convert((DropTableCommand) cmd))
-                            .handle(handleModificationResult(((DropTableCommand) cmd).ifTableExists(), TableNotFoundException.class))
-                    );
+                    .thenCompose(res -> catalogManager.execute(
+                            DdlToCatalogCommandConverter.convert((DropTableCommand) cmd))
+                            .handle(handleModificationResult(
+                                    ((DropTableCommand) cmd).ifTableExists(), TableNotFoundValidationException.class))
+                    ).handle(handleModificationResult(((DropTableCommand) cmd).ifTableExists(), TableNotFoundException.class));
         } else if (cmd instanceof AlterTableAddCommand) {
             AlterTableAddCommand addCommand = (AlterTableAddCommand) cmd;
 
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java
index 7a30c40d71..739e048c3d 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlToCatalogCommandConverter.java
@@ -34,12 +34,10 @@ import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
 import org.apache.ignite.internal.catalog.commands.ColumnParams;
 import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommandBuilder;
 import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
 import org.apache.ignite.internal.catalog.commands.DataStorageParams;
 import org.apache.ignite.internal.catalog.commands.DefaultValue;
 import org.apache.ignite.internal.catalog.commands.DropIndexParams;
-import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.commands.DropZoneParams;
 import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
 import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
@@ -63,10 +61,10 @@ import org.apache.ignite.internal.sql.engine.util.TypeUtils;
  * Converter for DDL command classes to Catalog command params classes.
  */
 class DdlToCatalogCommandConverter {
-    static CatalogCommand convert(CreateTableCommandBuilder commandBuilder, CreateTableCommand cmd) {
+    static CatalogCommand convert(CreateTableCommand cmd) {
         List<ColumnParams> columns = cmd.columns().stream().map(DdlToCatalogCommandConverter::convert).collect(Collectors.toList());
 
-        return commandBuilder
+        return org.apache.ignite.internal.catalog.commands.CreateTableCommand.builder()
                 .schemaName(cmd.schemaName())
                 .tableName(cmd.tableName())
 
@@ -79,8 +77,8 @@ class DdlToCatalogCommandConverter {
                 .build();
     }
 
-    static DropTableParams convert(DropTableCommand cmd) {
-        return DropTableParams.builder()
+    static CatalogCommand convert(DropTableCommand cmd) {
+        return org.apache.ignite.internal.catalog.commands.DropTableCommand.builder()
                 .schemaName(cmd.schemaName())
                 .tableName(cmd.tableName())
                 .build();
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
index 9e90c3c4f9..ab63d6d848 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
@@ -50,7 +50,6 @@ import java.util.function.LongFunction;
 import org.apache.ignite.internal.baseline.BaselineManager;
 import org.apache.ignite.internal.catalog.CatalogCommand;
 import org.apache.ignite.internal.catalog.CatalogManager;
-import org.apache.ignite.internal.catalog.commands.CreateTableCommand;
 import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologySnapshot;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
@@ -294,9 +293,7 @@ public class MockedStructuresTest extends IgniteAbstractTest {
         schemaManager.start();
 
         catalogManager = mock(CatalogManager.class);
-        when(catalogManager.createTableCommandBuilder()).thenReturn(new CreateTableCommand.Builder());
         when(catalogManager.execute(any(CatalogCommand.class))).thenReturn(completedFuture(null));
-        when(catalogManager.dropTable(any())).thenReturn(completedFuture(null));
 
         schemaSyncService = mock(SchemaSyncService.class);
         when(schemaSyncService.waitForMetadataCompleteness(any())).thenReturn(completedFuture(null));