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

[ignite-3] branch ignite-19942 updated (504a00fb68 -> f151119f2b)

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

amashenkov pushed a change to branch ignite-19942
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


    omit 504a00fb68 Resolve conflicts.
    omit 8cd5c8c4b1 Minor.
    omit af2838f64e Get rid of DdlCommandHandlerWrapper. Get rid of unused methods. Fix styles.
    omit 2f508819f8 Mirror Index changes from Config to Catalog
    omit 9134e621d8 Mirror Table changes from Config to Catalog.
    omit 7dfe878588 Mirror DistributionZone changes from Config to Catalog.
     add 794e272970 IGNITE-19986 Increase stability of inMemoryNodeRestartNotLeader in ItIgniteInMemoryNodeRestartTest (#2323)
     add b2fcc49669 IGNITE-19984 Improve "dependingOn" documentation and add clarifying tests. (#2319)
     add 0211489637 IGNITE-19654 Sql. Remove redundant planing timeout and use correct one (#2214)
     add b693a71856 IGNITE-19213 ODBC Data fetching (#2322)
     add f1efc25ce7 IGNITE-19399 Support ODBC transactions (#2324)
     add 1def52a8ac IGNITE-19995 Test disabled. (#2327)
     add f34beaed8b IGNITE-20003 Add support of ODBC version 3.0 (#2331)
     add 7b8307c1a9 IGNITE-19923 Docs for ODBC in Ignite 3 (#2333)
     add a1527975ab IGNITE-19374 Document client object mapping (#2123)
     add 19cbcd669c IGNITE-19887 Transfer observable timestamp to read-only transaction (#2325)
     add 3f89316ace IGNITE-19671 Save default configuration values to configuration storage (#2301)
     add ea3f9e0320 IGNITE-19999 Sql. Add planner test to verify numeric type coercion in binary comparison (#2335)
     add ab98c3e075 IGNITE-18621 Support ODBC Deb and RPM packages (#2338)
     add cb67401ecd IGNITE-19989 Fixed the name of updater thread and made it finish on node stop (#2332)
     add abe20cb4ee IGNITE-19862 Sql. Revise error codes for SQL module (#2271)
     add b687c3b0b8 Fix ItNodeTest#testNewPeersConfigurationAppliedListener flaky (#2337)
     add 86290418a7 Revert "Fix ItNodeTest#testNewPeersConfigurationAppliedListener flaky (#2337)"
     add a8a37e694a IGNITE-19996 Fix ItNodeTest#testNewPeersConfigurationAppliedListener flaky (#2337)
     add ddb5a7c1df IGNITE-19971 fix NPE in ItNodeTest.testLeaseReadAfterSegmentation (#2318)
     add f380ff60c9 IGNITE-20021 Too many Raft-FSMCaller-Disruptor threads (#2344)
     add 16aaee407c IGNITE-20011 Shutdown NodeStatusWatchListener executor service after stop (#2340)
     add 43e5b004c5 IGNITE-20029 Reduce heap size for integration tests (#2346)
     add 0e5049f7cc IGNITE-20031 NPE on the lease updater (#2348)
     add 55fee303f8 IGNITE-19863 Fix Compute API async method names, add sync counterparts (#2347)
     add df4fdc5986 IGNITE-20037 Fix Gradle issues when building Ignite 3 on Java 17 (#2351)
     new 8392fe8631 Mirror DistributionZone changes from Config to Catalog.
     new fe28c65cce Mirror Table changes from Config to Catalog.
     new a21adc78b2 Mirror Index changes from Config to Catalog
     new 38b512c5bd Get rid of DdlCommandHandlerWrapper. Get rid of unused methods. Fix styles.
     new a3c253a40f Minor.
     new f151119f2b Resolve conflicts.

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (504a00fb68)
            \
             N -- N -- N   refs/heads/ignite-19942 (f151119f2b)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 build.gradle                                       |    1 +
 buildscripts/java-integration-test.gradle          |    5 +-
 docs/_data/toc.yaml                                |    9 +
 docs/_docs/sql/odbc/connection-string.adoc         |   77 ++
 docs/_docs/sql/odbc/index.adoc                     |    6 +
 docs/_docs/sql/odbc/odbc-driver.adoc               |   96 ++
 docs/_docs/sql/odbc/querying-modifying-data.adoc   |  363 ++++++
 docs/_docs/thin-clients/index.adoc                 |  247 ++--
 gradle/wrapper/gradle-wrapper.properties           |    2 +-
 .../org/apache/ignite/compute/IgniteCompute.java   |  100 +-
 .../ignite/lang/IndexAlreadyExistsException.java   |    4 +-
 .../internal/catalog/CatalogServiceImpl.java       |    9 +-
 .../exception/handler/SqlExceptionHandler.java     |    4 +-
 .../client/handler/JdbcQueryEventHandlerImpl.java  |   15 +-
 .../ClientComputeExecuteColocatedRequest.java      |    2 +-
 .../compute/ClientComputeExecuteRequest.java       |    2 +-
 .../handler/JdbcQueryEventHandlerImplTest.java     |   30 +-
 .../apache/ignite/client/ClientOperationType.java  |    2 +-
 .../internal/client/compute/ClientCompute.java     |   12 +-
 .../apache/ignite/client/ClientComputeTest.java    |   49 +-
 .../ignite/client/PartitionAwarenessTest.java      |    8 +-
 .../apache/ignite/client/RequestBalancingTest.java |    2 +-
 .../apache/ignite/client/ServerMetricsTest.java    |   10 +-
 .../apache/ignite/client/fakes/FakeCompute.java    |    8 +-
 .../apache/ignite/client/fakes/FakeSession.java    |    4 +-
 .../internal/deployunit/DeploymentManagerImpl.java |    1 +
 .../metastore/NodeStatusWatchListener.java         |    4 +
 .../metastore/DeploymentUnitStoreImplTest.java     |   25 +-
 .../ignite/internal/compute/IgniteComputeImpl.java |    8 +-
 .../internal/compute/IgniteComputeImplTest.java    |    8 +-
 .../configuration/ConfigurationChanger.java        |  118 +-
 .../configuration/ConfigurationRegistry.java       |   18 +-
 .../configuration/ConfigurationChangerTest.java    |   15 +-
 .../asm/ConfigurationTreeGeneratorTest.java        |    1 -
 .../configuration/direct/DirectPropertiesTest.java |    2 -
 .../ConfigurationAnyListenerTest.java              |    2 -
 .../notifications/ConfigurationListenerTest.java   |    4 +-
 .../internal/configuration/sample/UsageTest.java   |    2 -
 .../configuration/tree/InternalIdTest.java         |    2 -
 .../causality/IncrementalVersionedValue.java       |   14 +-
 .../ignite/internal/hlc/HybridTimestamp.java       |    2 +-
 .../java/org/apache/ignite/lang/ErrorGroups.java   |  118 +-
 .../causality/IncrementalVersionedValueTest.java   |   49 +
 .../util/PendingComparableValuesTrackerTest.java   |    2 +
 .../internal/testframework/IgniteTestUtils.java    |   19 +-
 ...ibutionZoneManagerConfigurationChangesTest.java |   12 +-
 .../DistributionZoneManagerScaleUpTest.java        |    4 +-
 .../DistributionZoneManagerTest.java               |    4 +-
 modules/jdbc/build.gradle                          |    2 +-
 .../internal/jdbc/ItJdbcMetadataSelfTest.java      |    2 +-
 .../internal/jdbc/JdbcPreparedStatement.java       |    1 +
 .../internal/jdbc/PreparedStatementParamsTest.java |   44 +-
 .../internal/network/netty/ConnectionManager.java  |    4 +-
 .../internal/placementdriver/LeaseUpdater.java     |  193 ++--
 .../placementdriver/PlacementDriverManager.java    |   10 +-
 modules/platforms/build.gradle                     |   36 +
 modules/platforms/cpp/DEVNOTES.md                  |    1 +
 modules/platforms/cpp/ignite/client/CMakeLists.txt |    3 -
 .../cpp/ignite/client/basic_authenticator.h        |   22 +-
 .../platforms/cpp/ignite/client/compute/compute.h  |   10 +-
 .../ignite/client/detail/compute/compute_impl.cpp  |   15 +-
 .../ignite/client/detail/compute/compute_impl.h    |    2 +-
 .../ignite/client/detail/ignite_client_impl.cpp    |    3 +-
 .../cpp/ignite/client/detail/node_connection.cpp   |    7 +-
 .../cpp/ignite/client/detail/node_connection.h     |    4 +-
 .../cpp/ignite/client/detail/sql/result_set_impl.h |    2 +-
 .../cpp/ignite/client/detail/sql/sql_impl.cpp      |    8 +-
 .../cpp/ignite/client/detail/sql/sql_impl.h        |    2 +-
 .../cpp/ignite/client/detail/table/table_impl.cpp  |    4 +-
 .../cpp/ignite/client/detail/table/tables_impl.cpp |    3 +-
 .../cpp/ignite/client/detail/type_mapping_utils.h  |    8 +-
 .../platforms/cpp/ignite/client/detail/utils.cpp   |  273 +----
 modules/platforms/cpp/ignite/client/detail/utils.h |   29 +-
 .../ignite/client/ignite_client_authenticator.h    |    6 +-
 .../ignite/client/ignite_client_configuration.h    |    6 +-
 modules/platforms/cpp/ignite/client/sql/sql.h      |    2 +-
 .../cpp/ignite/client/sql/sql_statement.h          |    2 +-
 .../cpp/ignite/client/table/ignite_tuple.h         |    2 +-
 .../cpp/ignite/client/table/key_value_view.h       |   52 +-
 .../cpp/ignite/client/table/record_view.h          |   52 +-
 modules/platforms/cpp/ignite/common/CMakeLists.txt |    2 +
 modules/platforms/cpp/ignite/common/big_decimal.h  |   10 +-
 .../platforms/cpp/ignite/common/big_integer.cpp    |    1 +
 modules/platforms/cpp/ignite/common/bits.h         |   47 +-
 modules/platforms/cpp/ignite/common/end_point.h    |    2 +-
 .../cpp/ignite/{client => common}/primitive.h      |   24 +-
 .../ignite/{client => common}/primitive_test.cpp   |    2 +-
 .../cpp/ignite/network/detail/linux/sockets.cpp    |   10 +-
 .../cpp/ignite/network/detail/linux/sockets.h      |    2 +-
 .../network/detail/linux/tcp_socket_client.h       |   75 +-
 .../platforms/cpp/ignite/network/detail/utils.h    |    6 +-
 .../cpp/ignite/network/detail/win/sockets.cpp      |   10 +-
 .../ignite/network/detail/win/tcp_socket_client.h  |   72 +-
 modules/platforms/cpp/ignite/network/network.cpp   |    5 +-
 .../platforms/cpp/ignite/network/socket_client.h   |   15 +-
 .../ignite/odbc/app/application_data_buffer.cpp    |  868 +++++++-------
 .../cpp/ignite/odbc/app/application_data_buffer.h  |  123 +-
 .../odbc/app/application_data_buffer_test.cpp      |  330 +++---
 .../platforms/cpp/ignite/odbc/app/parameter.cpp    |  161 +--
 modules/platforms/cpp/ignite/odbc/app/parameter.h  |   19 +-
 .../cpp/ignite/odbc/app/parameter_set.cpp          |  121 +-
 .../platforms/cpp/ignite/odbc/app/parameter_set.h  |   41 +-
 modules/platforms/cpp/ignite/odbc/common_types.cpp |   28 +-
 modules/platforms/cpp/ignite/odbc/common_types.h   |   22 +-
 .../cpp/ignite/odbc/config/config_tools.cpp        |   32 +-
 .../cpp/ignite/odbc/config/config_tools.h          |   15 +-
 .../cpp/ignite/odbc/config/config_tools_test.cpp   |   22 +-
 .../cpp/ignite/odbc/config/configuration.cpp       |   14 +-
 .../cpp/ignite/odbc/config/configuration.h         |   23 +-
 .../cpp/ignite/odbc/config/connection_info.cpp     |  346 +++---
 .../cpp/ignite/odbc/config/connection_info.h       |   13 +-
 .../ignite/odbc/config/connection_info_test.cpp    |   75 +-
 .../cpp/ignite/odbc/config/value_with_default.h    |   11 +-
 .../cpp/ignite/odbc/diagnostic/diagnosable.h       |   30 +-
 .../ignite/odbc/diagnostic/diagnosable_adapter.cpp |   20 +-
 .../ignite/odbc/diagnostic/diagnosable_adapter.h   |   40 +-
 .../ignite/odbc/diagnostic/diagnostic_record.cpp   |  224 ++--
 .../cpp/ignite/odbc/diagnostic/diagnostic_record.h |   22 +-
 .../odbc/diagnostic/diagnostic_record_storage.cpp  |  113 +-
 .../odbc/diagnostic/diagnostic_record_storage.h    |   18 +-
 modules/platforms/cpp/ignite/odbc/entry_points.cpp |  596 +++-------
 modules/platforms/cpp/ignite/odbc/log.cpp          |   16 +-
 modules/platforms/cpp/ignite/odbc/log.h            |   68 +-
 .../platforms/cpp/ignite/odbc/meta/column_meta.cpp |  111 +-
 .../platforms/cpp/ignite/odbc/meta/column_meta.h   |   51 +-
 .../cpp/ignite/odbc/meta/primary_key_meta.h        |   35 +-
 .../platforms/cpp/ignite/odbc/meta/table_meta.cpp  |   12 +-
 .../platforms/cpp/ignite/odbc/meta/table_meta.h    |   32 +-
 modules/platforms/cpp/ignite/odbc/odbc.cpp         |  516 +++------
 modules/platforms/cpp/ignite/odbc/odbc.h           |  293 ++---
 modules/platforms/cpp/ignite/odbc/odbc_error.h     |   20 +-
 .../platforms/cpp/ignite/odbc/protocol_version.cpp |   57 +-
 .../platforms/cpp/ignite/odbc/protocol_version.h   |   27 +-
 modules/platforms/cpp/ignite/odbc/query/cursor.h   |  100 +-
 .../platforms/cpp/ignite/odbc/query/data_query.cpp |  343 ++++--
 .../platforms/cpp/ignite/odbc/query/data_query.h   |   56 +-
 modules/platforms/cpp/ignite/odbc/query/query.h    |   24 +-
 .../platforms/cpp/ignite/odbc/query/result_page.h  |   90 ++
 .../platforms/cpp/ignite/odbc/sql_connection.cpp   |  403 +++----
 modules/platforms/cpp/ignite/odbc/sql_connection.h |  134 ++-
 .../platforms/cpp/ignite/odbc/sql_environment.cpp  |   96 +-
 .../platforms/cpp/ignite/odbc/sql_environment.h    |   20 +-
 .../platforms/cpp/ignite/odbc/sql_statement.cpp    |  581 ++++------
 modules/platforms/cpp/ignite/odbc/sql_statement.h  |  143 ++-
 modules/platforms/cpp/ignite/odbc/ssl_mode.cpp     |   12 +-
 modules/platforms/cpp/ignite/odbc/ssl_mode.h       |    8 +-
 modules/platforms/cpp/ignite/odbc/string_utils.h   |   27 +-
 .../cpp/ignite/odbc/string_utils_test.cpp          |   46 +-
 .../cpp/ignite/odbc/system/odbc_constants.h        |    6 +-
 modules/platforms/cpp/ignite/odbc/type_traits.cpp  |  176 ++-
 modules/platforms/cpp/ignite/odbc/type_traits.h    |   13 +-
 modules/platforms/cpp/ignite/odbc/utility.cpp      |   10 +-
 modules/platforms/cpp/ignite/odbc/utility.h        |   11 +-
 modules/platforms/cpp/ignite/protocol/reader.h     |   14 +-
 modules/platforms/cpp/ignite/protocol/utils.cpp    |  282 ++++-
 modules/platforms/cpp/ignite/protocol/utils.h      |   29 +-
 modules/platforms/cpp/ignite/protocol/writer.h     |    6 +-
 modules/platforms/cpp/ignite/tuple/tuple_test.cpp  |    9 +-
 .../cpp/tests/client-test/all_fields_type.h        |   14 +-
 .../tests/client-test/basic_authenticator_test.cpp |    9 +-
 .../cpp/tests/client-test/ignite_runner_suite.h    |    4 +-
 .../cpp/tests/client-test/key_value_view_test.cpp  |   54 +-
 modules/platforms/cpp/tests/client-test/main.cpp   |   94 +-
 .../cpp/tests/client-test/record_view_test.cpp     |   90 +-
 .../platforms/cpp/tests/client-test/sql_test.cpp   |   35 +-
 .../platforms/cpp/tests/odbc-test/CMakeLists.txt   |    4 +
 .../cpp/tests/odbc-test/api_robustness_test.cpp    |  277 ++---
 .../cpp/tests/odbc-test/connection_test.cpp        |   31 +
 .../platforms/cpp/tests/odbc-test/error_test.cpp   |   53 +-
 .../cpp/tests/odbc-test/many_cursors_test.cpp      |  216 ++++
 .../cpp/tests/odbc-test/meta_queries_test.cpp      |  245 ++--
 .../cpp/tests/odbc-test/odbc_connection.h          |  268 ++++-
 modules/platforms/cpp/tests/odbc-test/odbc_suite.h |    2 +-
 .../cpp/tests/odbc-test/odbc_test_utils.h          |   65 +-
 .../platforms/cpp/tests/odbc-test/queries_test.cpp | 1184 ++++++++++++++++++++
 .../platforms/cpp/tests/odbc-test/timeout_test.cpp |  184 +++
 .../cpp/tests/odbc-test/transaction_test.cpp       |  600 ++++++++++
 .../cpp/tests/test-common/ignite_runner.h          |    7 +-
 .../dotnet/Apache.Ignite.Tests/FakeServer.cs       |    2 +-
 .../dotnet/Apache.Ignite.Tests/FakeServerTests.cs  |    2 +-
 .../dotnet/Apache.Ignite/Internal/Sql/Sql.cs       |    4 +-
 .../apache/ignite/raft/jraft/core/ItNodeTest.java  |   24 +-
 .../ignite/internal/replicator/ReplicaManager.java |    6 +-
 .../ignite/internal/compute/ItComputeBaseTest.java |  116 +-
 .../internal/compute/ItComputeTestStandalone.java  |   19 +-
 .../raftsnapshot/ItTableRaftSnapshotsTest.java     |    2 +-
 .../app/ItIgniteInMemoryNodeRestartTest.java       |   35 +-
 .../ItRaftCommandLeftInLogUntilRestartTest.java    |   11 +
 .../runner/app/client/ItThinClientComputeTest.java |  108 +-
 .../client/ItThinClientPartitionAwarenessTest.java |    2 +-
 .../ignite/internal/sql/api/ItCommonApiTest.java   |   20 +-
 .../internal/sql/api/ItSqlAsynchronousApiTest.java |    4 +-
 .../internal/sql/api/ItSqlSynchronousApiTest.java  |    2 +-
 .../internal/sql/engine/ItDataTypesTest.java       |    3 +-
 .../ignite/internal/sql/engine/ItDmlTest.java      |   43 +-
 .../sql/engine/ItDynamicParameterTest.java         |    8 +-
 .../internal/sql/engine/ItFunctionsTest.java       |    3 +-
 .../internal/sql/engine/ItImplicitCastsTest.java   |    4 +-
 .../ignite/internal/sql/engine/ItIntervalTest.java |   22 +-
 .../sql/engine/ItPkOnlyTableCrossApiTest.java      |    8 +-
 .../datatypes/tests/BaseDmlDataTypeTest.java       |   12 +-
 .../tests/BaseExpressionDataTypeTest.java          |    4 +-
 .../datatypes/tests/BaseQueryDataTypeTest.java     |    4 +-
 .../sql/engine/datatypes/uuid/ItUuidQueryTest.java |    4 +-
 .../datatypes/varbinary/ItVarBinaryQueryTest.java  |    4 +-
 .../org/apache/ignite/internal/app/IgniteImpl.java |    2 +-
 .../storage/LocalFileConfigurationStorageTest.java |  117 +-
 modules/schema/build.gradle                        |    1 +
 .../LowWatermarkConfigurationSchema.java           |    6 +-
 modules/sql-engine/build.gradle                    |    1 +
 .../internal/sql/api/SessionBuilderImpl.java       |    1 -
 .../ignite/internal/sql/api/SessionImpl.java       |   52 +-
 ...celledException.java => NodeLeftException.java} |   17 +-
 .../ignite/internal/sql/engine/QueryCancel.java    |    9 +-
 .../sql/engine/QueryCancelledException.java        |    4 +-
 .../internal/sql/engine/SqlQueryProcessor.java     |   28 +-
 .../sql/engine/exec/ExecutionServiceImpl.java      |   16 +-
 .../sql/engine/exec/QueryValidationException.java  |    4 +-
 .../sql/engine/exec/UpdatableTableImpl.java        |    4 +-
 .../sql/engine/exec/ddl/DdlCommandHandler.java     |    6 +-
 .../sql/engine/exec/exp/IgniteSqlFunctions.java    |    9 +-
 .../internal/sql/engine/exec/rel/AbstractNode.java |    7 +-
 .../sql/engine/exec/rel/HashAggregateNode.java     |    8 +-
 .../ignite/internal/sql/engine/exec/rel/Inbox.java |    4 +-
 .../internal/sql/engine/exec/rel/RootNode.java     |    5 +-
 .../internal/sql/engine/externalize/RelJson.java   |    9 +-
 .../sql/engine/externalize/RelJsonReader.java      |    6 +-
 .../sql/engine/externalize/RelJsonWriter.java      |    6 +-
 .../sql/engine/message/MessageServiceImpl.java     |    7 +-
 .../internal/sql/engine/prepare/IgnitePlanner.java |   18 +-
 .../sql/engine/prepare/PlanningContext.java        |   82 +-
 .../sql/engine/prepare/PrepareService.java         |    5 +
 .../sql/engine/prepare/PrepareServiceImpl.java     |   53 +-
 .../internal/sql/engine/prepare/QueryTemplate.java |    6 +-
 .../prepare/ddl/DdlSqlToCommandConverter.java      |   46 +-
 .../sql/engine/schema/SqlSchemaManagerImpl.java    |    7 +-
 .../SessionNotFoundException.java}                 |   20 +-
 .../internal/sql/engine/sql/IgniteSqlParser.java   |    4 +-
 .../sql/engine/sql/StatementParseResult.java       |    4 +-
 .../internal/sql/engine/util/BaseQueryContext.java |   20 +-
 .../ignite/internal/sql/engine/util/Commons.java   |    6 +-
 .../internal/sql/engine/StopCalciteModuleTest.java |    2 +-
 .../sql/engine/exec/ExecutionServiceImplTest.java  |    9 +-
 .../DdlCommandHandlerExceptionHandlingTest.java    |    4 +-
 .../internal/sql/engine/framework/TestNode.java    |    3 +-
 .../sql/engine/planner/AbstractPlannerTest.java    |    4 +
 .../sql/engine/planner/PlannerTimeoutTest.java     |   38 +-
 .../NumericComparisonTypeCoercionTest.java         |  965 ++++++++++++++++
 .../planner/datatypes/utils/NumericPair.java       |  239 ++++
 .../engine/planner/datatypes/utils/TypePair.java}  |   28 +-
 .../sql/engine/planner/datatypes/utils/Types.java  |   48 +
 .../DistributionZoneSqlToCommandConverterTest.java |    8 +-
 .../internal/sql/engine}/util/SqlTestUtils.java    |   23 +-
 .../internal/table/distributed/LowWatermark.java   |    2 +-
 .../internal/table/distributed/TableManager.java   |    4 +-
 .../RepeatedFinishReadWriteTransactionTest.java    |    2 +-
 .../org/apache/ignite/internal/tx/TxManager.java   |    6 +-
 .../internal/tx/impl/IgniteTransactionsImpl.java   |    4 +-
 .../ignite/internal/tx/impl/TxManagerImpl.java     |   28 +-
 .../apache/ignite/internal/tx/TxManagerTest.java   |   59 +-
 packaging/odbc/build.gradle                        |  108 ++
 packaging/odbc/ignite3-odbc.ini                    |    5 +
 .../scripts/postInstall.sh}                        |    5 +-
 .../scripts/postUninstall.sh}                      |    3 -
 .../preUninstall.sh => odbc/scripts/preInstall.sh} |    3 -
 .../{linux/deb => odbc/scripts}/preUninstall.sh    |    3 +-
 settings.gradle                                    |    2 +
 267 files changed, 9953 insertions(+), 5962 deletions(-)
 create mode 100644 docs/_docs/sql/odbc/connection-string.adoc
 create mode 100644 docs/_docs/sql/odbc/index.adoc
 create mode 100644 docs/_docs/sql/odbc/odbc-driver.adoc
 create mode 100644 docs/_docs/sql/odbc/querying-modifying-data.adoc
 rename modules/platforms/cpp/ignite/{client => common}/primitive.h (95%)
 rename modules/platforms/cpp/ignite/{client => common}/primitive_test.cpp (98%)
 create mode 100644 modules/platforms/cpp/ignite/odbc/query/result_page.h
 create mode 100644 modules/platforms/cpp/tests/odbc-test/many_cursors_test.cpp
 create mode 100644 modules/platforms/cpp/tests/odbc-test/queries_test.cpp
 create mode 100644 modules/platforms/cpp/tests/odbc-test/timeout_test.cpp
 create mode 100644 modules/platforms/cpp/tests/odbc-test/transaction_test.cpp
 copy modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/{QueryCancelledException.java => NodeLeftException.java} (68%)
 copy modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/{property/PropertyNotFoundException.java => session/SessionNotFoundException.java} (62%)
 create mode 100644 modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/datatypes/NumericComparisonTypeCoercionTest.java
 create mode 100644 modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/datatypes/utils/NumericPair.java
 copy modules/{cli/src/main/java/org/apache/ignite/internal/cli/core/repl/expander/NoopExpander.java => sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/datatypes/utils/TypePair.java} (62%)
 create mode 100644 modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/datatypes/utils/Types.java
 rename modules/{runner/src/testFixtures/java/org/apache/ignite/internal/sql => sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine}/util/SqlTestUtils.java (86%)
 create mode 100644 packaging/odbc/build.gradle
 create mode 100644 packaging/odbc/ignite3-odbc.ini
 copy packaging/{linux/rpm/preUninstall.sh => odbc/scripts/postInstall.sh} (93%)
 copy packaging/{linux/deb/preUninstall.sh => odbc/scripts/postUninstall.sh} (96%)
 copy packaging/{linux/deb/preUninstall.sh => odbc/scripts/preInstall.sh} (96%)
 copy packaging/{linux/deb => odbc/scripts}/preUninstall.sh (95%)


[ignite-3] 02/06: Mirror Table changes from Config to Catalog.

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit fe28c65cceba17f5e5dfcbfc518c086d3605c764
Author: amashenkov <an...@gmail.com>
AuthorDate: Fri Jul 7 15:40:08 2023 +0300

    Mirror Table changes from Config to Catalog.
---
 .../internal/catalog/commands/CatalogUtils.java    |  69 ++++++-
 .../internal/catalog/commands/ColumnParams.java    |   6 +-
 .../internal/catalog/CatalogServiceSelfTest.java   |   2 +-
 .../storage/ItRebalanceDistributedTest.java        |  32 ++--
 .../inmemory/ItRaftStorageVolatilityTest.java      |  12 +-
 .../raftsnapshot/ItTableRaftSnapshotsTest.java     |   2 +-
 .../runner/app/ItIgniteNodeRestartTest.java        |   5 +-
 .../runner/app/ItSchemaChangeKvViewTest.java       |   2 +
 .../runner/app/ItSchemaChangeTableViewTest.java    |   1 +
 .../runner/app/ItTableApiContractTest.java         | 124 ++++++------
 .../internal/runner/app/ItTablesApiTest.java       |  56 +++---
 .../runner/app/PlatformTestNodeRunner.java         |  18 +-
 .../ignite/internal/sql/api/ItCommonApiTest.java   |   6 +-
 .../internal/sql/api/ItSqlAsynchronousApiTest.java |  22 +--
 .../internal/sql/api/ItSqlSynchronousApiTest.java  |  24 +--
 .../internal/sql/engine/ItCreateTableDdlTest.java  |  30 +--
 .../ignite/internal/table/ItRoReadsTest.java       |  24 ++-
 .../org/apache/ignite/internal/app/IgniteImpl.java |   1 +
 modules/schema/build.gradle                        |   1 +
 .../internal/schema/CatalogDescriptorUtils.java    | 111 +++++++++++
 .../testutils/SchemaToCatalogParamsConverter.java  | 208 +++++++++++++++++++++
 .../sql/engine/exec/ddl/DdlCommandHandler.java     |   2 +-
 .../engine/exec/ddl/DdlCommandHandlerWrapper.java  |  42 ++---
 .../exec/ddl/DdlToCatalogCommandConverter.java     |   3 +
 .../sql/engine/exec/MockedStructuresTest.java      |   8 +
 .../internal/table/distributed/TableManager.java   | 204 +++++++++++++++++++-
 .../table/distributed/TableManagerTest.java        |  72 ++++---
 27 files changed, 812 insertions(+), 275 deletions(-)

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 7823b09d47..d157cbaba2 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
@@ -38,6 +38,31 @@ import org.apache.ignite.sql.ColumnType;
  * Catalog utils.
  */
 public class CatalogUtils {
+    /**
+     * Default TIMESTAMP type precision: microseconds.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 36
+     */
+    public static final int DEFAULT_TIMESTAMP_PRECISION = 6;
+    /**
+     * Default TIME type precision: seconds.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 36
+     */
+    public static final int DEFAULT_TIME_PRECISION = 0;
+    /**
+     * Default DECIMAL precision is implementation-defined.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 25
+     */
+    public static final int DEFAULT_DECIMAL_PRECISION = 19;
+    /**
+     * Default DECIMAL scale is implementation-defined.
+     *
+     * <p>SQL`16 part 2 section 6.1 syntax rule 25
+     */
+    public static final int DEFAULT_DECIMAL_SCALE = 3;
+
     private static final Map<ColumnType, Set<ColumnType>> ALTER_COLUMN_TYPE_TRANSITIONS = new EnumMap<>(ColumnType.class);
 
     static {
@@ -125,9 +150,9 @@ public class CatalogUtils {
      * @return Column descriptor.
      */
     public static CatalogTableColumnDescriptor fromParams(ColumnParams params) {
-        int precision = params.precision() != null ? params.precision() : 0;
-        int scale = params.scale() != null ? params.scale() : 0;
-        int length = params.length() != null ? params.length() : 0;
+        int precision = params.precision() != null ? params.precision() : defaultPrecision(params.type());
+        int scale = params.scale() != null ? params.scale() : defaultScale(params.type());
+        int length = params.length() != null ? params.length() : defaultLength(params.type());
         DefaultValue defaultValue = params.defaultValueDefinition();
 
         return new CatalogTableColumnDescriptor(params.name(), params.type(), params.nullable(),
@@ -146,4 +171,42 @@ public class CatalogUtils {
 
         return supportedTransitions != null && supportedTransitions.contains(target);
     }
+
+    private static int defaultPrecision(ColumnType columnType) {
+        //TODO IGNITE-19938: Add REAL,FLOAT and DOUBLE precision. See SQL`16 part 2 section 6.1 syntax rule 29-31
+        switch (columnType) {
+            case NUMBER:
+            case DECIMAL:
+                return DEFAULT_DECIMAL_PRECISION;
+            case TIME:
+                return DEFAULT_TIME_PRECISION;
+            case TIMESTAMP:
+            case DATETIME:
+                return DEFAULT_TIMESTAMP_PRECISION;
+            default:
+                return 0;
+        }
+    }
+
+    private static int defaultScale(ColumnType columnType) {
+        //TODO IGNITE-19938: Add REAL,FLOAT and DOUBLE precision. See SQL`16 part 2 section 6.1 syntax rule 29-31
+        if (columnType == ColumnType.DECIMAL) {
+            return DEFAULT_DECIMAL_SCALE;
+        }
+
+        return 0;
+    }
+
+    private static int defaultLength(ColumnType columnType) {
+        //TODO IGNITE-19938: Return length for other types. See SQL`16 part 2 section 6.1 syntax rule 39
+        switch (columnType) {
+            case BITMASK:
+            case STRING:
+            case BYTE_ARRAY:
+                return Integer.MAX_VALUE;
+            default:
+                return 0;
+        }
+    }
+
 }
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java
index f95e0544d7..9a57887652 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/ColumnParams.java
@@ -158,7 +158,7 @@ public class ColumnParams {
          *
          * @return {@code this}.
          */
-        public Builder precision(int precision) {
+        public Builder precision(Integer precision) {
             params.precision = precision;
 
             return this;
@@ -169,7 +169,7 @@ public class ColumnParams {
          *
          * @return {@code this}.
          */
-        public Builder scale(int scale) {
+        public Builder scale(Integer scale) {
             params.scale = scale;
 
             return this;
@@ -180,7 +180,7 @@ public class ColumnParams {
          *
          * @return {@code this}.
          */
-        public Builder length(int length) {
+        public Builder length(Integer length) {
             params.length = length;
 
             return this;
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java
index f0e5e0e300..75f8bbf786 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java
@@ -406,7 +406,7 @@ public class CatalogServiceSelfTest {
         assertEquals(DefaultValue.Type.CONSTANT, column.defaultValue().type());
         assertEquals("Ignite!", ((DefaultValue.ConstantValue) column.defaultValue()).value());
 
-        assertEquals(0, column.length());
+        assertEquals(Integer.MAX_VALUE, column.length());
         assertEquals(0, column.precision());
         assertEquals(0, column.scale());
     }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java
index 74573201f7..a1ba47148b 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java
@@ -125,7 +125,7 @@ import org.apache.ignite.internal.schema.configuration.defaultvalue.ConstantValu
 import org.apache.ignite.internal.schema.configuration.defaultvalue.FunctionCallDefaultConfigurationSchema;
 import org.apache.ignite.internal.schema.configuration.defaultvalue.NullValueDefaultConfigurationSchema;
 import org.apache.ignite.internal.schema.configuration.index.HashIndexConfigurationSchema;
-import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
@@ -270,9 +270,7 @@ public class ItRebalanceDistributedTest {
         ).withPrimaryKey("key").build();
 
         await(nodes.get(0).tableManager.createTableAsync(
-                "TBL1",
-                ZONE_1_NAME,
-                tblChanger -> SchemaConfigurationConverter.convert(schTbl1, tblChanger)
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_1_NAME, schTbl1)
         ));
 
         assertEquals(1, getPartitionClusterNodes(0, 0).size());
@@ -296,9 +294,7 @@ public class ItRebalanceDistributedTest {
         ).withPrimaryKey("key").build();
 
         await(nodes.get(0).tableManager.createTableAsync(
-                "TBL1",
-                ZONE_1_NAME,
-                tblChanger -> SchemaConfigurationConverter.convert(schTbl1, tblChanger)
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_1_NAME, schTbl1)
         ));
 
         assertEquals(1, getPartitionClusterNodes(0, 0).size());
@@ -323,9 +319,8 @@ public class ItRebalanceDistributedTest {
         ).withPrimaryKey("key").build();
 
         await(nodes.get(0).tableManager.createTableAsync(
-                "TBL1",
-                ZONE_1_NAME,
-                tblChanger -> SchemaConfigurationConverter.convert(schTbl1, tblChanger)));
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_1_NAME, schTbl1)
+        ));
 
         assertEquals(1, getPartitionClusterNodes(0, 0).size());
 
@@ -353,9 +348,8 @@ public class ItRebalanceDistributedTest {
 
         // Tests that the distribution zone created on node0 is available on node1.
         TableImpl table = (TableImpl) await(nodes.get(1).tableManager.createTableAsync(
-                "TBL1",
-                zoneName,
-                tblChanger -> SchemaConfigurationConverter.convert(schTbl1, tblChanger)));
+                SchemaToCatalogParamsConverter.toCreateTable(zoneName, schTbl1)
+        ));
 
         Set<String> partitionNodesConsistentIds = getPartitionClusterNodes(0, 0).stream()
                 .map(Assignment::consistentId)
@@ -416,9 +410,8 @@ public class ItRebalanceDistributedTest {
         ).withPrimaryKey("key").build();
 
         await(nodes.get(0).tableManager.createTableAsync(
-                "TBL1",
-                ZONE_1_NAME,
-                tblChanger -> SchemaConfigurationConverter.convert(schTbl1, tblChanger)));
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_1_NAME, schTbl1)
+        ));
 
         assertEquals(1, getPartitionClusterNodes(0, 0).size());
 
@@ -820,6 +813,7 @@ public class ItRebalanceDistributedTest {
                     dataStorageMgr,
                     storagePath,
                     metaStorageManager,
+                    catalogManager,
                     schemaManager,
                     view -> new LocalLogStorageFactory(),
                     new HybridClockImpl(),
@@ -1007,11 +1001,7 @@ public class ItRebalanceDistributedTest {
 
         assertThat(
                 nodes.get(0).tableManager.createTableAsync(
-                        tableName,
-                        zoneName,
-                        tableChange -> {
-                            SchemaConfigurationConverter.convert(createTableDefinition(tableName), tableChange);
-                        }
+                        SchemaToCatalogParamsConverter.toCreateTable(zoneName, createTableDefinition(tableName))
                 ),
                 willCompleteSuccessfully()
         );
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java
index 9c7f7d4115..e19cb341e0 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/inmemory/ItRaftStorageVolatilityTest.java
@@ -21,7 +21,6 @@ import static ca.seinesoftware.hamcrest.path.PathMatcher.exists;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_PARTITION_COUNT;
-import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_NAME;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesTestUtil.createZone;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -42,7 +41,7 @@ import org.apache.ignite.internal.ClusterPerTestIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.raft.configuration.EntryCountBudgetChange;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
-import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
@@ -240,7 +239,7 @@ class ItRaftStorageVolatilityTest extends ClusterPerTestIntegrationTest {
     }
 
     private void createTableWithMaxOneInMemoryEntryAllowed(String tableName) {
-        int zoneId = await(createZone(
+        await(createZone(
                 node(0).distributionZoneManager(), "zone1", 1, DEFAULT_PARTITION_COUNT,
                 dataStorageChange -> dataStorageChange.convert(VolatilePageMemoryDataStorageChange.class)));
 
@@ -249,9 +248,8 @@ class ItRaftStorageVolatilityTest extends ClusterPerTestIntegrationTest {
                 SchemaBuilders.column("NAME", ColumnType.string()).asNullable(true).build()
         ).withPrimaryKey("ID").build();
 
-        await(((TableManager) node(0).tables()).createTableAsync(tableName, DEFAULT_ZONE_NAME, tableChange -> {
-            SchemaConfigurationConverter.convert(tableDef, tableChange)
-                    .changeZoneId(zoneId);
-        }));
+        await(((TableManager) node(0).tables()).createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable("zone1", tableDef)
+        ));
     }
 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
index cfc9bc7c9d..0f3069a620 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItTableRaftSnapshotsTest.java
@@ -354,7 +354,7 @@ class ItTableRaftSnapshotsTest extends IgniteIntegrationTest {
     }
 
     private void createTestTableWith3Replicas(String storageEngine) throws InterruptedException {
-        String zoneSql = "create zone test_zone"
+        String zoneSql = "create zone TEST_ZONE"
                 + (DEFAULT_STORAGE_ENGINE.equals(storageEngine) ? "" : " engine " + storageEngine)
                 + " with partitions=1, replicas=3;";
         String sql = "create table test (key int primary key, value varchar(20))"
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index 2d3c724058..45bc03c3a4 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -153,10 +153,10 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
     private static final IntFunction<String> VALUE_PRODUCER = i -> "val " + i;
 
     /** Test table name. */
-    private static final String TABLE_NAME = "Table1";
+    private static final String TABLE_NAME = "Table1".toUpperCase();
 
     /** Test table name. */
-    private static final String TABLE_NAME_2 = "Table2";
+    private static final String TABLE_NAME_2 = "Table2".toUpperCase();
 
     @InjectConfiguration("mock: " + RAFT_CFG)
     private static RaftConfiguration raftConfiguration;
@@ -374,6 +374,7 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
                 dataStorageManager,
                 storagePath,
                 metaStorageMgr,
+                catalogManager,
                 schemaManager,
                 view -> new LocalLogStorageFactory(),
                 hybridClock,
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeKvViewTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeKvViewTest.java
index deb86eaadf..197d44d38c 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeKvViewTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeKvViewTest.java
@@ -28,11 +28,13 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.schema.SchemaMismatchException;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.Tuple;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 /**
  * Ignition interface tests.
  */
+@Disabled("IGNITE-19499")
 class ItSchemaChangeKvViewTest extends AbstractSchemaChangeTest {
     /**
      * Check add a new column to table schema.
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeTableViewTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeTableViewTest.java
index 9906221940..b759356c78 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeTableViewTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItSchemaChangeTableViewTest.java
@@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test;
 /**
  * Ignition interface tests.
  */
+@Disabled("IGNITE-19499")
 class ItSchemaChangeTableViewTest extends AbstractSchemaChangeTest {
     /**
      * Check add a new column to table schema.
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java
index 91da7e94e7..a60da2e800 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTableApiContractTest.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.runner.app;
 
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_NAME;
-import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
@@ -34,8 +33,14 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.IntStream;
 import org.apache.ignite.Ignite;
+import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams;
+import org.apache.ignite.internal.catalog.commands.ColumnParams;
+import org.apache.ignite.internal.catalog.commands.DefaultValue;
+import org.apache.ignite.internal.catalog.commands.DropTableParams;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.table.distributed.TableManager;
 import org.apache.ignite.lang.TableAlreadyExistsException;
@@ -142,13 +147,19 @@ public class ItTableApiContractTest extends ClusterPerClassIntegrationTest {
      */
     @Test
     public void testDropTable() throws Exception {
-        CompletableFuture<Void> dropTblFut1 =  tableManager().dropTableAsync(TABLE_NAME);
+        CompletableFuture<Void> dropTblFut1 = tableManager().dropTableAsync(DropTableParams.builder()
+                .schemaName(SCHEMA)
+                .tableName(TABLE_NAME)
+                .build());
 
         dropTblFut1.get();
 
         assertNull(ignite.tables().table(TABLE_NAME));
 
-        CompletableFuture<Void> dropTblFut2 = tableManager().dropTableAsync(TABLE_NAME);
+        CompletableFuture<Void> dropTblFut2 = tableManager().dropTableAsync(DropTableParams.builder()
+                .schemaName(SCHEMA)
+                .tableName(TABLE_NAME)
+                .build());
 
         assertThrows(TableNotFoundException.class, () -> futureResult(dropTblFut2));
     }
@@ -160,23 +171,29 @@ public class ItTableApiContractTest extends ClusterPerClassIntegrationTest {
      */
     @Test
     public void testAlterTable() throws Exception {
-        await(tableManager().alterTableAsync(TABLE_NAME, chng -> {
-            chng.changeColumns(cols ->
-                    cols.create("NAME_1", colChg -> convert(SchemaBuilders.column("NAME_1", ColumnType.string()).asNullable(true)
-                            .withDefaultValue("default").build(), colChg)));
-            return true;
-        }));
+        await(tableManager().alterTableAddColumnAsync(AlterTableAddColumnParams.builder()
+                .schemaName(SCHEMA)
+                .tableName(TABLE_NAME)
+                .columns(List.of(
+                        ColumnParams.builder().name("NAME_1").type(org.apache.ignite.sql.ColumnType.STRING).nullable(true)
+                                .defaultValue(DefaultValue.constant("default")).build()
+                ))
+                .build()
+        ));
 
         assertNotNull(ignite.tables().table(TABLE_NAME));
 
-        assertNull(ignite.tables().table(TABLE_NAME + "_not_exist"));
-
-        assertThrows(TableNotFoundException.class, () -> await(tableManager().alterTableAsync(TABLE_NAME + "_not_exist", chng -> {
-            chng.changeColumns(cols ->
-                    cols.create("NAME_1", colChg -> convert(SchemaBuilders.column("NAME_1", ColumnType.string()).asNullable(true)
-                            .withDefaultValue("default").build(), colChg)));
-            return true;
-        })));
+        assertNull(ignite.tables().table("UNKNOWN"));
+
+        assertThrows(TableNotFoundException.class, () -> await(tableManager().alterTableAddColumnAsync(AlterTableAddColumnParams.builder()
+                .schemaName(SCHEMA)
+                .tableName("UNKNOWN")
+                .columns(List.of(
+                        ColumnParams.builder().name("NAME_1").type(org.apache.ignite.sql.ColumnType.STRING).nullable(true)
+                                .defaultValue(DefaultValue.constant("default")).build()
+                ))
+                .build()
+        )));
     }
 
     /**
@@ -186,68 +203,49 @@ public class ItTableApiContractTest extends ClusterPerClassIntegrationTest {
      */
     @Test
     public void testAlterTableAsync() throws Exception {
-        CompletableFuture<Void> altTblFut1 = tableManager().alterTableAsync(TABLE_NAME,
-                chng -> {
-                    chng.changeColumns(cols ->
-                            cols.create("NAME_1", colChg -> convert(SchemaBuilders.column("NAME_1",
-                                            ColumnType.string()).asNullable(true).withDefaultValue("default").build(), colChg)));
-                return true;
-            });
-
-        CompletableFuture<Void> altTblFut2 = tableManager().alterTableAsync(TABLE_NAME + "_not_exist",
-                chng -> {
-                    chng.changeColumns(cols ->
-                            cols.create("NAME_1", colChg -> convert(SchemaBuilders.column("NAME_1",
-                                            ColumnType.string()).asNullable(true).withDefaultValue("default").build(), colChg)));
-                    return true;
-            });
+        CompletableFuture<Void> altTblFut1 = tableManager().alterTableAddColumnAsync(AlterTableAddColumnParams.builder()
+                .schemaName(SCHEMA)
+                .tableName(TABLE_NAME)
+                .columns(List.of(
+                        ColumnParams.builder().name("NAME_1").type(org.apache.ignite.sql.ColumnType.STRING).nullable(true)
+                                .defaultValue(DefaultValue.constant("default")).build()
+                ))
+                .build());
+
+        CompletableFuture<Void> altTblFut2 = tableManager().alterTableAddColumnAsync(AlterTableAddColumnParams.builder()
+                .schemaName(SCHEMA)
+                .tableName("UNKNOWN")
+                .columns(List.of(
+                        ColumnParams.builder().name("NAME_1").type(org.apache.ignite.sql.ColumnType.STRING).nullable(true)
+                                .defaultValue(DefaultValue.constant("default")).build()
+                ))
+                .build());
 
         assertNotNull(ignite.tables().table(TABLE_NAME));
 
-        assertNull(ignite.tables().table(TABLE_NAME + "_not_exist"));
+        assertNull(ignite.tables().table("UNKNOWN"));
 
         altTblFut1.get();
 
         assertThrows(TableNotFoundException.class, () -> futureResult(altTblFut2));
     }
 
-    /**
-     * Checks a contract for table creation.
-     *
-     * @throws Exception If failed.
-     */
-    @Test
-    public void testCreateTable() throws Exception {
-        Table table = ignite.tables().table(TABLE_NAME);
-
-        assertNotNull(table);
-
-        assertThrows(TableAlreadyExistsException.class,
-                () -> await(tableManager().createTableAsync(TABLE_NAME, DEFAULT_ZONE_NAME,
-                        tableChange -> convert(SchemaBuilders.tableBuilder(SCHEMA, TABLE_NAME)
-                                .columns(
-                                        SchemaBuilders.column("new_key", ColumnType.INT64).build(),
-                                        SchemaBuilders.column("new_val", ColumnType.string()).build())
-                                .withPrimaryKey("new_key")
-                                .build(), tableChange))));
-    }
-
     /**
      * Checks a contract for asynchronous table creation.
-     *
-     * @throws Exception If failed.
      */
     @Test
-    public void testCreateTableAsync() throws Exception {
+    public void testCreateTableAsync() {
         assertNotNull(ignite.tables().table(TABLE_NAME));
 
+        TableDefinition tableDefinition = SchemaBuilders.tableBuilder(SCHEMA, TABLE_NAME)
+                .columns(
+                        SchemaBuilders.column("new_key", ColumnType.INT64).build(),
+                        SchemaBuilders.column("new_val", ColumnType.string()).build())
+                .withPrimaryKey("new_key")
+                .build();
+
         CompletableFuture<Table> tableFut2 = tableManager()
-                .createTableAsync(TABLE_NAME, DEFAULT_ZONE_NAME, tableChange -> convert(SchemaBuilders.tableBuilder(SCHEMA, TABLE_NAME)
-                        .columns(
-                                SchemaBuilders.column("new_key", ColumnType.INT64).build(),
-                                SchemaBuilders.column("new_val", ColumnType.string()).build())
-                        .withPrimaryKey("new_key")
-                        .build(), tableChange));
+                .createTableAsync(SchemaToCatalogParamsConverter.toCreateTable(DEFAULT_ZONE_NAME, tableDefinition));
 
         assertThrows(TableAlreadyExistsException.class, () -> futureResult(tableFut2));
     }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTablesApiTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTablesApiTest.java
index cb96e88300..c4fc440077 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTablesApiTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItTablesApiTest.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.runner.app;
 import static java.util.concurrent.CompletableFuture.runAsync;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
 import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_NAME;
-import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.test.WatchListenerInhibitor.metastorageEventsInhibitor;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
@@ -44,6 +43,9 @@ import java.util.stream.IntStream;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.InitParameters;
+import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams;
+import org.apache.ignite.internal.catalog.commands.DropTableParams;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
@@ -442,7 +444,10 @@ public class ItTablesApiTest extends IgniteAbstractTest {
 
         ignite1Inhibitor.startInhibit();
 
-        await(((TableManager) clusterNodes.get(0).tables()).dropTableAsync(TABLE_NAME));
+        await(((TableManager) clusterNodes.get(0).tables()).dropTableAsync(DropTableParams.builder()
+                .schemaName(SCHEMA)
+                .tableName(TABLE_NAME)
+                .build()));
 
         // Because the event inhibitor was started, last metastorage updates do not reach to one node.
         // Therefore the table still exists locally, but API prevents getting it.
@@ -466,11 +471,6 @@ public class ItTablesApiTest extends IgniteAbstractTest {
      * @param tableName Table name.
      */
     protected Table createTable(Ignite node, String tableName) {
-        List<ColumnDefinition> cols = new ArrayList<>();
-        cols.add(SchemaBuilders.column("key", ColumnType.INT64).build());
-        cols.add(SchemaBuilders.column("valInt", ColumnType.INT32).asNullable(true).build());
-        cols.add(SchemaBuilders.column("valStr", ColumnType.string()).withDefaultValue("default").build());
-
         var tmpl = "CREATE TABLE %s (key BIGINT PRIMARY KEY, valInt INT, valStr VARCHAR)";
         var sql = String.format(tmpl, tableName);
 
@@ -489,17 +489,19 @@ public class ItTablesApiTest extends IgniteAbstractTest {
      */
     protected Table createTableIfNotExists(Ignite node, String tableName) {
         try {
-            return await(((TableManager) node.tables()).createTableAsync(
-                    tableName,
-                    DEFAULT_ZONE_NAME,
-                    tblCh -> convert(SchemaBuilders.tableBuilder(SCHEMA, tableName).columns(Arrays.asList(
+            TableManager tableManager = (TableManager) node.tables();
+
+            await(tableManager.createTableAsync(
+                    SchemaToCatalogParamsConverter.toCreateTable(DEFAULT_ZONE_NAME,
+                            SchemaBuilders.tableBuilder(SCHEMA, tableName).columns(Arrays.asList(
                                     SchemaBuilders.column("key", ColumnType.INT64).build(),
                                     SchemaBuilders.column("valInt", ColumnType.INT32).asNullable(true).build(),
                                     SchemaBuilders.column("valStr", ColumnType.string())
                                             .withDefaultValue("default").build()
-                            )).withPrimaryKey("key").build(),
-                            tblCh)
+                            )).withPrimaryKey("key").build())
             ));
+
+            return tableManager.table(tableName);
         } catch (TableAlreadyExistsException ex) {
             return node.tables().table(tableName);
         }
@@ -512,7 +514,10 @@ public class ItTablesApiTest extends IgniteAbstractTest {
      * @param tableName Table name.
      */
     protected void dropTable(Ignite node, String tableName) {
-        await(((TableManager) node.tables()).dropTableAsync(tableName));
+        await(((TableManager) node.tables()).dropTableAsync(DropTableParams.builder()
+                .schemaName(SCHEMA)
+                .tableName(TABLE_NAME)
+                .build()));
     }
 
     /**
@@ -523,7 +528,10 @@ public class ItTablesApiTest extends IgniteAbstractTest {
      */
     protected void dropTableIfExists(Ignite node, String tableName) {
         try {
-            await(((TableManager) node.tables()).dropTableAsync(tableName));
+            await(((TableManager) node.tables()).dropTableAsync(DropTableParams.builder()
+                    .schemaName(SCHEMA)
+                    .tableName(tableName)
+                    .build()));
         } catch (TableNotFoundException ex) {
             log.info("Dropping the table ignored.", ex);
         }
@@ -550,18 +558,12 @@ public class ItTablesApiTest extends IgniteAbstractTest {
      * @param colDefinition Column defenition.
      */
     private void addColumnInternal(Ignite node, String tableName, ColumnDefinition colDefinition) {
-        await(((TableManager) node.tables()).alterTableAsync(
-                tableName,
-                chng -> {
-                    chng.changeColumns(cols -> {
-                        try {
-                            cols.create(colDefinition.name(), colChg -> convert(colDefinition, colChg));
-                        } catch (IllegalArgumentException e) {
-                            throw new ColumnAlreadyExistsException(colDefinition.name());
-                        }
-                    });
-                    return true;
-                }));
+        await(((TableManager) node.tables()).alterTableAddColumnAsync(
+                AlterTableAddColumnParams.builder()
+                        .schemaName(SCHEMA)
+                        .tableName(tableName)
+                        .columns(List.of(SchemaToCatalogParamsConverter.convert(colDefinition)))
+                        .build()));
     }
 
     /**
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/PlatformTestNodeRunner.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/PlatformTestNodeRunner.java
index 67579912c5..c279aa9f62 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/PlatformTestNodeRunner.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/PlatformTestNodeRunner.java
@@ -48,7 +48,7 @@ import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.schema.marshaller.TupleMarshallerException;
 import org.apache.ignite.internal.schema.marshaller.TupleMarshallerImpl;
 import org.apache.ignite.internal.schema.row.Row;
-import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType.TemporalColumnType;
@@ -267,8 +267,8 @@ public class PlatformTestNodeRunner {
                 SchemaBuilders.column("val", ColumnType.string()).asNullable(true).build()
         ).withPrimaryKey(keyCol).build();
 
-        await(((TableManager) node.tables()).createTableAsync(schTbl.name(), ZONE_NAME, tblCh ->
-                SchemaConfigurationConverter.convert(schTbl, tblCh)
+        await(((TableManager) node.tables()).createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_NAME, schTbl)
         ));
 
         int maxTimePrecision = TemporalColumnType.MAX_TIME_PRECISION;
@@ -295,8 +295,8 @@ public class PlatformTestNodeRunner {
                 SchemaBuilders.column("decimal", ColumnType.decimal()).asNullable(true).build()
         ).withPrimaryKey(keyCol).build();
 
-        await(((TableManager) node.tables()).createTableAsync(schTblAll.name(), ZONE_NAME, tblCh ->
-                SchemaConfigurationConverter.convert(schTblAll, tblCh)
+        await(((TableManager) node.tables()).createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_NAME, schTblAll)
         ));
 
         // TODO IGNITE-18431 remove extra table, use TABLE_NAME_ALL_COLUMNS for SQL tests.
@@ -321,8 +321,8 @@ public class PlatformTestNodeRunner {
                 SchemaBuilders.column("decimal", ColumnType.decimal()).asNullable(true).build()
         ).withPrimaryKey(keyCol).build();
 
-        await(((TableManager) node.tables()).createTableAsync(schTblAllSql.name(), ZONE_NAME, tblCh ->
-                SchemaConfigurationConverter.convert(schTblAllSql, tblCh)
+        await(((TableManager) node.tables()).createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_NAME, schTblAllSql)
         ));
 
         createTwoColumnTable(node, ColumnType.INT8);
@@ -351,8 +351,8 @@ public class PlatformTestNodeRunner {
                 SchemaBuilders.column("val", type).asNullable(true).build()
         ).withPrimaryKey(keyCol).build();
 
-        await(((TableManager) node.tables()).createTableAsync(schTbl.name(), ZONE_NAME, tblCh ->
-                SchemaConfigurationConverter.convert(schTbl, tblCh)
+        await(((TableManager) node.tables()).createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_NAME, schTbl)
         ));
     }
 
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
index 2211137be9..0c1d3b55e9 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
@@ -33,7 +33,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.calcite.schema.SchemaPlus;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.app.IgniteImpl;
-import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType.TemporalColumnType;
@@ -144,8 +144,8 @@ public class ItCommonApiTest extends ClusterPerClassIntegrationTest {
                 SchemaBuilders.column("datetime", ColumnType.datetime(maxTimePrecision)).asNullable(true).build()
         ).withPrimaryKey(keyCol).build();
 
-        await(((TableManager) node.tables()).createTableAsync(schTblAllSql.name(), DEFAULT_ZONE_NAME, tblCh ->
-                SchemaConfigurationConverter.convert(schTblAllSql, tblCh)
+        await(((TableManager) node.tables()).createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable(DEFAULT_ZONE_NAME, schTblAllSql)
         ));
 
         Table tbl = node.tables().table(kvTblName);
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
index 473d6399f7..105463070c 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
@@ -22,7 +22,6 @@ import static org.apache.ignite.internal.sql.engine.util.QueryChecker.containsTa
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.lang.ErrorGroups.Sql.CONSTRAINT_VIOLATION_ERR;
-import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
@@ -182,26 +181,21 @@ public class ItSqlAsynchronousApiTest extends ClusterPerClassIntegrationTest {
 
         checkError(
                 SqlException.class,
-                "Can`t delete column(s). Column VAL1 is used by indexes [TEST_IDX3].",
+                "Can't drop indexed column: [columnName=VAL1, indexName=TEST_IDX3]",
                 ses,
                 "ALTER TABLE TEST DROP COLUMN val1"
         );
 
-        SqlException ex = IgniteTestUtils.cause(assertThrows(Throwable.class,
-                () -> await(ses.executeAsync(null, "ALTER TABLE TEST DROP COLUMN (val0, val1)"))), SqlException.class);
-        assertNotNull(ex);
-        assertEquals(STMT_VALIDATION_ERR, ex.code());
-
-        String msg = ex.getMessage();
-        String explainMsg = "Unexpected error message: " + msg;
-
-        assertTrue(msg.contains("Column VAL0 is used by indexes ["), explainMsg);
-        assertTrue(msg.contains("TEST_IDX1") && msg.contains("TEST_IDX2") && msg.contains("TEST_IDX3"), explainMsg);
-        assertTrue(msg.contains("Column VAL1 is used by indexes [TEST_IDX3]"), explainMsg);
+        checkError(
+                SqlException.class,
+                "Can't drop indexed column: [columnName=VAL0, indexName=TEST_IDX1]",
+                ses,
+                "ALTER TABLE TEST DROP COLUMN (val0, val1)"
+        );
 
         checkError(
                 SqlException.class,
-                "Can`t delete column, belongs to primary key: [name=ID]",
+                "Can't drop primary key column: [name=ID]",
                 ses,
                 "ALTER TABLE TEST DROP COLUMN id"
         );
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
index 376f71f63f..f2c713c34c 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlSynchronousApiTest.java
@@ -18,11 +18,8 @@
 package org.apache.ignite.internal.sql.api;
 
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
-import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
-import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -165,26 +162,21 @@ public class ItSqlSynchronousApiTest extends ClusterPerClassIntegrationTest {
 
         checkError(
                 SqlException.class,
-                "Can`t delete column(s). Column VAL1 is used by indexes [TEST_IDX3].",
+                "Can't drop indexed column: [columnName=VAL1, indexName=TEST_IDX3]",
                 ses,
                 "ALTER TABLE TEST DROP COLUMN val1"
         );
 
-        SqlException ex = IgniteTestUtils.cause(assertThrows(Throwable.class,
-                () -> await(ses.executeAsync(null, "ALTER TABLE TEST DROP COLUMN (val0, val1)"))), SqlException.class);
-        assertNotNull(ex);
-        assertEquals(STMT_VALIDATION_ERR, ex.code());
-
-        String msg = ex.getMessage();
-        String explainMsg = "Unexpected error message: " + msg;
-
-        assertTrue(msg.contains("Column VAL0 is used by indexes ["), explainMsg);
-        assertTrue(msg.contains("TEST_IDX1") && msg.contains("TEST_IDX2") && msg.contains("TEST_IDX3"), explainMsg);
-        assertTrue(msg.contains("Column VAL1 is used by indexes [TEST_IDX3]"), explainMsg);
+        checkError(
+                SqlException.class,
+                "Can't drop indexed column: [columnName=VAL0, indexName=TEST_IDX1]",
+                ses,
+                "ALTER TABLE TEST DROP COLUMN (val0, val1)"
+        );
 
         checkError(
                 SqlException.class,
-                "Can`t delete column, belongs to primary key: [name=ID]",
+                "Can't drop primary key column: [name=ID]",
                 ses,
                 "ALTER TABLE TEST DROP COLUMN id"
         );
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
index 6f81d7e757..d292d3246f 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItCreateTableDdlTest.java
@@ -25,13 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.configuration.ConfigurationManager;
 import org.apache.ignite.internal.schema.Column;
-import org.apache.ignite.internal.schema.configuration.ExtendedTableView;
-import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import org.apache.ignite.internal.table.TableImpl;
-import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.sql.SqlException;
 import org.junit.jupiter.api.AfterEach;
@@ -150,7 +145,7 @@ public class ItCreateTableDdlTest extends ClusterPerClassIntegrationTest {
                         IgniteException.class,
                         () -> sql("CREATE TABLE T0(ID0 INT, ID1 INT, VAL INT, PRIMARY KEY (ID1, ID0)) COLOCATE (ID1, ID0, ID1)")
                 ).getMessage(),
-                containsString("Colocation columns contains duplicates: [duplicates=[ID1]]]")
+                containsString("Colocation columns contains duplicates: ID1, ID0, ID1")
         );
     }
 
@@ -202,29 +197,6 @@ public class ItCreateTableDdlTest extends ClusterPerClassIntegrationTest {
         assertEquals(3, res.get(0).get(0));
     }
 
-    /**
-     * Checks that schema version is updated even if column names are intersected.
-     */
-    // Need to be removed after https://issues.apache.org/jira/browse/IGNITE-19082
-    @Test
-    public void checkSchemaUpdatedWithEqAlterColumn() {
-        sql("CREATE TABLE TEST(ID INT PRIMARY KEY, VAL0 INT)");
-
-        Ignite node = CLUSTER_NODES.get(0);
-
-        ConfigurationManager cfgMgr = IgniteTestUtils.getFieldValue(node, "clusterCfgMgr");
-
-        TablesConfiguration tablesConfiguration = cfgMgr.configurationRegistry().getConfiguration(TablesConfiguration.KEY);
-
-        int schIdBefore = ((ExtendedTableView) tablesConfiguration.tables().get("TEST").value()).schemaId();
-
-        sql("ALTER TABLE TEST ADD COLUMN (VAL1 INT)");
-
-        int schIdAfter = ((ExtendedTableView) tablesConfiguration.tables().get("TEST").value()).schemaId();
-
-        assertEquals(schIdBefore + 1, schIdAfter);
-    }
-
     /**
      * Check explicit colocation columns configuration.
      */
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItRoReadsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItRoReadsTest.java
index ff2a3b83f1..55bf5008eb 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItRoReadsTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItRoReadsTest.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.table;
 import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_REPLICA_COUNT;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesTestUtil.createZone;
 import static org.apache.ignite.internal.runner.app.ItTablesApiTest.SCHEMA;
-import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
@@ -43,6 +42,7 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.InitParameters;
 import org.apache.ignite.internal.app.IgniteImpl;
+import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.schema.BinaryRow;
@@ -52,6 +52,7 @@ import org.apache.ignite.internal.schema.NativeTypes;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.schema.row.Row;
 import org.apache.ignite.internal.schema.row.RowAssembler;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
@@ -82,7 +83,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 public class ItRoReadsTest extends BaseIgniteAbstractTest {
     private static final IgniteLogger LOG = Loggers.forClass(ItRoReadsTest.class);
 
-    private static final String TABLE_NAME = "some-table";
+    private static final String TABLE_NAME = "some-table".toUpperCase();
 
     private static final SchemaDescriptor SCHEMA_1 = new SchemaDescriptor(
             1,
@@ -522,18 +523,23 @@ public class ItRoReadsTest extends BaseIgniteAbstractTest {
         cols.add(SchemaBuilders.column("valStr", ColumnType.string()).withDefaultValue("default").build());
 
         String zoneName = "zone_" + tableName;
-        int zoneId = await(createZone(((IgniteImpl) node).distributionZoneManager(), zoneName, 1, DEFAULT_REPLICA_COUNT));
+        await(createZone(((IgniteImpl) node).distributionZoneManager(), zoneName, 1, DEFAULT_REPLICA_COUNT));
 
-        return await(((TableManager) node.tables()).createTableAsync(
-                tableName,
-                zoneName,
-                tblCh -> convert(SchemaBuilders.tableBuilder(SCHEMA, tableName).columns(
-                        cols).withPrimaryKey("key").build(), tblCh)
+        TableManager tableManager = (TableManager) node.tables();
+
+        await(tableManager.createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable(zoneName, SchemaBuilders.tableBuilder(SCHEMA, tableName).columns(
+                        cols).withPrimaryKey("key").build())
         ));
+
+        return tableManager.table(tableName);
     }
 
     private static void stopTable(Ignite node, String tableName) {
-        await(((TableManager) node.tables()).dropTableAsync(tableName));
+        await(((TableManager) node.tables()).dropTableAsync(DropTableParams.builder()
+                .schemaName(SCHEMA)
+                .tableName(tableName)
+                .build()));
         await(((IgniteImpl) node).distributionZoneManager().dropZone("zone_" + tableName));
     }
 
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index c4eda773d6..c88c78b8ac 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -538,6 +538,7 @@ public class IgniteImpl implements Ignite {
                 dataStorageMgr,
                 storagePath,
                 metaStorageMgr,
+                catalogManager,
                 schemaManager,
                 volatileLogStorageFactoryCreator,
                 clock,
diff --git a/modules/schema/build.gradle b/modules/schema/build.gradle
index 92e8100a45..088019e4e4 100644
--- a/modules/schema/build.gradle
+++ b/modules/schema/build.gradle
@@ -52,6 +52,7 @@ dependencies {
     testFixturesImplementation project(':ignite-api')
     testFixturesImplementation project(':ignite-bytecode')
     testFixturesImplementation project(':ignite-configuration-api')
+    testFixturesImplementation project(':ignite-catalog')
     testFixturesImplementation(testFixtures(project(':ignite-core')))
     testFixturesImplementation libs.jetbrains.annotations
     testFixturesImplementation libs.junit5.api
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java
index 8acc7aa194..54dca3f1b1 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java
@@ -22,7 +22,11 @@ import static org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollat
 import static org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation.DESC_NULLS_FIRST;
 
 import java.util.List;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
+import org.apache.ignite.internal.catalog.commands.ColumnParams;
 import org.apache.ignite.internal.catalog.commands.DefaultValue;
+import org.apache.ignite.internal.catalog.commands.DefaultValue.ConstantValue;
+import org.apache.ignite.internal.catalog.commands.DefaultValue.FunctionCall;
 import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
 import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexColumnDescriptor;
@@ -30,6 +34,8 @@ import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
 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.schema.configuration.ColumnChange;
+import org.apache.ignite.internal.schema.configuration.ColumnTypeChange;
 import org.apache.ignite.internal.schema.configuration.ColumnTypeView;
 import org.apache.ignite.internal.schema.configuration.ColumnView;
 import org.apache.ignite.internal.schema.configuration.ConfigurationToSchemaDescriptorConverter;
@@ -38,8 +44,11 @@ import org.apache.ignite.internal.schema.configuration.TableView;
 import org.apache.ignite.internal.schema.configuration.ValueSerializationHelper;
 import org.apache.ignite.internal.schema.configuration.defaultvalue.ColumnDefaultConfigurationSchema;
 import org.apache.ignite.internal.schema.configuration.defaultvalue.ColumnDefaultView;
+import org.apache.ignite.internal.schema.configuration.defaultvalue.ConstantValueDefaultChange;
 import org.apache.ignite.internal.schema.configuration.defaultvalue.ConstantValueDefaultView;
+import org.apache.ignite.internal.schema.configuration.defaultvalue.FunctionCallDefaultChange;
 import org.apache.ignite.internal.schema.configuration.defaultvalue.FunctionCallDefaultView;
+import org.apache.ignite.internal.schema.configuration.defaultvalue.NullValueDefaultChange;
 import org.apache.ignite.internal.schema.configuration.index.HashIndexView;
 import org.apache.ignite.internal.schema.configuration.index.IndexColumnView;
 import org.apache.ignite.internal.schema.configuration.index.SortedIndexView;
@@ -197,4 +206,106 @@ public class CatalogDescriptorUtils {
 
         return new CatalogIndexColumnDescriptor(config.name(), collation);
     }
+
+    /**
+     * Applies changes from params to the configuraiton changer.
+     *
+     * @param params Column change parameters.
+     * @param columnChange Configuration changer.
+     */
+    public static void convertColumnDefinition(ColumnParams params, ColumnChange columnChange) {
+        NativeType nativeType = getNativeType(CatalogUtils.fromParams(params));
+
+        columnChange.changeType(columnTypeChange -> convert(nativeType, columnTypeChange));
+        columnChange.changeNullable(params.nullable());
+        columnChange.changeDefaultValueProvider(defaultChange -> {
+            switch (params.defaultValueDefinition().type()) {
+                case CONSTANT:
+                    ConstantValue constantValue = params.defaultValueDefinition();
+
+                    var val = constantValue.value();
+
+                    if (val != null) {
+                        defaultChange.convert(ConstantValueDefaultChange.class)
+                                .changeDefaultValue(ValueSerializationHelper.toString(val, nativeType));
+                    } else {
+                        defaultChange.convert(NullValueDefaultChange.class);
+                    }
+
+                    break;
+                case FUNCTION_CALL:
+                    FunctionCall functionCall = params.defaultValueDefinition();
+
+                    defaultChange.convert(FunctionCallDefaultChange.class)
+                            .changeFunctionName(functionCall.functionName());
+
+                    break;
+                default:
+                    throw new IllegalStateException("Unknown default value definition type [type="
+                            + params.defaultValueDefinition().type() + ']');
+            }
+        });
+    }
+
+    private static void convert(NativeType colType, ColumnTypeChange colTypeChg) {
+        NativeTypeSpec spec = colType.spec();
+        String typeName = spec.name().toUpperCase();
+
+        colTypeChg.changeType(typeName);
+
+        switch (spec) {
+            case INT8:
+            case INT16:
+            case INT32:
+            case INT64:
+            case FLOAT:
+            case DOUBLE:
+            case DATE:
+            case UUID:
+                // do nothing
+                break;
+
+            case BITMASK:
+                BitmaskNativeType bitmaskColType = (BitmaskNativeType) colType;
+
+                colTypeChg.changeLength(bitmaskColType.bits());
+
+                break;
+
+            case BYTES:
+            case STRING:
+                VarlenNativeType varLenColType = (VarlenNativeType) colType;
+
+                colTypeChg.changeLength(varLenColType.length());
+
+                break;
+
+            case DECIMAL:
+                DecimalNativeType numColType = (DecimalNativeType) colType;
+
+                colTypeChg.changePrecision(numColType.precision());
+                colTypeChg.changeScale(numColType.scale());
+
+                break;
+
+            case NUMBER:
+                NumberNativeType numType = (NumberNativeType) colType;
+
+                colTypeChg.changePrecision(numType.precision());
+
+                break;
+
+            case TIME:
+            case DATETIME:
+            case TIMESTAMP:
+                TemporalNativeType temporalColType = (TemporalNativeType) colType;
+
+                colTypeChg.changePrecision(temporalColType.precision());
+
+                break;
+
+            default:
+                throw new IllegalArgumentException("Unknown type " + colType.spec().name());
+        }
+    }
 }
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaToCatalogParamsConverter.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaToCatalogParamsConverter.java
new file mode 100644
index 0000000000..a00eda8c7f
--- /dev/null
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaToCatalogParamsConverter.java
@@ -0,0 +1,208 @@
+/*
+ * 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.schema.testutils;
+
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.apache.ignite.internal.catalog.commands.ColumnParams;
+import org.apache.ignite.internal.catalog.commands.ColumnParams.Builder;
+import org.apache.ignite.internal.catalog.commands.CreateTableParams;
+import org.apache.ignite.internal.catalog.commands.DefaultValue;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.DefaultValueDefinition.ConstantValue;
+import org.apache.ignite.internal.schema.testutils.definition.DefaultValueDefinition.FunctionCall;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
+
+/**
+ * Schema to Catalog params converter.
+ */
+public class SchemaToCatalogParamsConverter {
+    /**
+     * Types map.
+     */
+    private static final EnumSet<ColumnType.ColumnTypeSpec> fixSizedTypes = EnumSet.of(
+            ColumnType.INT8.typeSpec(),
+            ColumnType.INT16.typeSpec(),
+            ColumnType.INT32.typeSpec(),
+            ColumnType.INT64.typeSpec(),
+            ColumnType.FLOAT.typeSpec(),
+            ColumnType.DOUBLE.typeSpec(),
+            ColumnType.UUID.typeSpec(),
+            ColumnType.DATE.typeSpec()
+    );
+
+    /**
+     * Converts table definition to CreateTableParams.
+     */
+    public static CreateTableParams toCreateTable(String zoneName, TableDefinition tableDef) {
+        Set<String> keyColumns = tableDef.keyColumns();
+
+        List<String> keyColumnsInOrder = tableDef.columns().stream()
+                .map(ColumnDefinition::name)
+                .filter(keyColumns::contains)
+                .collect(Collectors.toList());
+
+        List<ColumnParams> columnParams = tableDef.columns().stream()
+                .map(SchemaToCatalogParamsConverter::convert)
+                .collect(Collectors.toList());
+
+        return CreateTableParams.builder()
+                .schemaName(tableDef.schemaName())
+                .tableName(tableDef.name())
+                .zone(zoneName)
+                .columns(columnParams)
+                .primaryKeyColumns(keyColumnsInOrder)
+                .colocationColumns(tableDef.colocationColumns())
+                .build();
+    }
+
+    /**
+     * Convert column to column change.
+     *
+     * @param def Column to convert.
+     * @return Column params.
+     */
+    public static ColumnParams convert(ColumnDefinition def) {
+        Builder builder = ColumnParams.builder()
+                .name(def.name())
+                .nullable(def.nullable());
+
+        setType(builder, def.type());
+
+        assert def.defaultValueDefinition() != null;
+
+        switch (def.defaultValueDefinition().type()) {
+            case CONSTANT:
+                ConstantValue constantValue = def.defaultValueDefinition();
+
+                builder.defaultValue(DefaultValue.constant(constantValue.value()));
+
+                break;
+            case FUNCTION_CALL:
+                FunctionCall functionCall = def.defaultValueDefinition();
+
+                builder.defaultValue(DefaultValue.functionCall(functionCall.functionName()));
+
+                break;
+            case NULL:
+
+                builder.defaultValue(DefaultValue.constant(null));
+                break;
+            default:
+                throw new IllegalStateException("Unknown default value definition type [type="
+                        + def.defaultValueDefinition().type() + ']');
+        }
+
+        return builder.build();
+    }
+
+    private static org.apache.ignite.sql.ColumnType convert(ColumnType colType) {
+        switch (colType.typeSpec()) {
+            case INT8:
+                return org.apache.ignite.sql.ColumnType.INT8;
+            case INT16:
+                return org.apache.ignite.sql.ColumnType.INT16;
+            case INT32:
+                return org.apache.ignite.sql.ColumnType.INT32;
+            case INT64:
+                return org.apache.ignite.sql.ColumnType.INT64;
+            case FLOAT:
+                return org.apache.ignite.sql.ColumnType.FLOAT;
+            case DOUBLE:
+                return org.apache.ignite.sql.ColumnType.DOUBLE;
+            case DECIMAL:
+                return org.apache.ignite.sql.ColumnType.DECIMAL;
+            case DATE:
+                return org.apache.ignite.sql.ColumnType.DATE;
+            case TIME:
+                return org.apache.ignite.sql.ColumnType.TIME;
+            case DATETIME:
+                return org.apache.ignite.sql.ColumnType.DATETIME;
+            case TIMESTAMP:
+                return org.apache.ignite.sql.ColumnType.TIMESTAMP;
+            case UUID:
+                return org.apache.ignite.sql.ColumnType.UUID;
+            case BITMASK:
+                return org.apache.ignite.sql.ColumnType.BITMASK;
+            case STRING:
+                return org.apache.ignite.sql.ColumnType.STRING;
+            case BYTES:
+                return org.apache.ignite.sql.ColumnType.BYTE_ARRAY;
+            case NUMBER:
+                return org.apache.ignite.sql.ColumnType.NUMBER;
+
+            default:
+                throw new IllegalArgumentException("Type is not supported: " + colType.typeSpec());
+        }
+    }
+
+    /**
+     * Convert ColumnType to ColumnTypeChange.
+     *
+     * @param builder Column builder.
+     * @param colType ColumnType.
+     */
+    private static void setType(Builder builder, ColumnType colType) {
+        builder.type(convert(colType));
+
+        if (fixSizedTypes.contains(colType.typeSpec())) {
+            return;
+        }
+
+        switch (colType.typeSpec()) {
+            case BITMASK:
+            case BYTES:
+            case STRING:
+                int length = ((ColumnType.VarLenColumnType) colType).length();
+
+                if (length == 0) {
+                    length = Integer.MAX_VALUE;
+                }
+
+                builder.length(length);
+
+                return;
+            case DECIMAL:
+                ColumnType.DecimalColumnType numColType = (ColumnType.DecimalColumnType) colType;
+
+                builder.precision(numColType.precision());
+                builder.scale(numColType.scale());
+
+                return;
+            case NUMBER:
+                ColumnType.NumberColumnType numType = (ColumnType.NumberColumnType) colType;
+
+                builder.precision(numType.precision());
+
+                return;
+            case TIME:
+            case DATETIME:
+            case TIMESTAMP:
+                ColumnType.TemporalColumnType temporalColType = (ColumnType.TemporalColumnType) colType;
+
+                builder.precision(temporalColType.precision());
+
+                return;
+            default:
+                throw new IllegalArgumentException("Unknown type " + colType.typeSpec().name());
+        }
+    }
+}
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
index 0bc672a58e..f56848c215 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
@@ -104,7 +104,7 @@ import org.apache.ignite.sql.SqlException;
 public class DdlCommandHandler {
     private final DistributionZoneManager distributionZoneManager;
 
-    private final TableManager tableManager;
+    protected final TableManager tableManager;
 
     private final IndexManager indexManager;
 
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 a7a9b7f78e..bb702d4566 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
@@ -66,40 +66,32 @@ public class DdlCommandHandlerWrapper extends DdlCommandHandler {
     /** Handles ddl commands. */
     @Override
     public CompletableFuture<Boolean> handle(DdlCommand cmd) {
-        // Handle command in usual way.
-        CompletableFuture<Boolean> ddlCommandFuture = super.handle(cmd);
-
-        // Pass supported commands to the Catalog.
+        // TODO IGNITE-19082 replace TableManager with CatalogManager calls.
         if (cmd instanceof CreateTableCommand) {
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.createTable(DdlToCatalogCommandConverter.convert((CreateTableCommand) cmd))
-                            .handle(handleModificationResult(((CreateTableCommand) cmd).ifTableExists(), TableAlreadyExistsException.class))
-                    );
+            return tableManager.createTableAsync(DdlToCatalogCommandConverter.convert((CreateTableCommand) cmd))
+                    .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))
-                    );
+            return tableManager.dropTableAsync(DdlToCatalogCommandConverter.convert((DropTableCommand) cmd))
+                    .handle(handleModificationResult(((DropTableCommand) cmd).ifTableExists(), TableNotFoundException.class));
         } else if (cmd instanceof AlterTableAddCommand) {
             AlterTableAddCommand addCommand = (AlterTableAddCommand) cmd;
 
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.addColumn(DdlToCatalogCommandConverter.convert(addCommand))
-                            .handle(handleModificationResult(addCommand.ifTableExists(), TableNotFoundException.class))
-                    );
+            return tableManager.alterTableAddColumnAsync(DdlToCatalogCommandConverter.convert(addCommand))
+                    .handle(handleModificationResult(addCommand.ifTableExists(), TableNotFoundException.class));
         } else if (cmd instanceof AlterTableDropCommand) {
             AlterTableDropCommand dropCommand = (AlterTableDropCommand) cmd;
 
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.dropColumn(DdlToCatalogCommandConverter.convert(dropCommand))
-                            .handle(handleModificationResult(dropCommand.ifTableExists(), TableNotFoundException.class))
-                    );
+            return tableManager.alterTableDropColumnAsync(DdlToCatalogCommandConverter.convert(dropCommand))
+                    .handle(handleModificationResult(dropCommand.ifTableExists(), TableNotFoundException.class));
         } else if (cmd instanceof AlterColumnCommand) {
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.alterColumn(DdlToCatalogCommandConverter.convert((AlterColumnCommand) cmd))
-                            .handle(handleModificationResult(((AlterColumnCommand) cmd).ifTableExists(), TableNotFoundException.class))
-                    );
-        } else if (cmd instanceof CreateIndexCommand) {
+            return catalogManager.alterColumn(DdlToCatalogCommandConverter.convert((AlterColumnCommand) cmd))
+                    .handle(handleModificationResult(((AlterColumnCommand) cmd).ifTableExists(), TableNotFoundException.class));
+        }
+
+        // Handle command in usual way.
+        CompletableFuture<Boolean> ddlCommandFuture = super.handle(cmd);
+
+        if (cmd instanceof CreateIndexCommand) {
             return ddlCommandFuture
                     .thenCompose(res -> {
                         AbstractIndexCommandParams params = DdlToCatalogCommandConverter.convert((CreateIndexCommand) 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 22eb89195b..3e958d982b 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
@@ -216,6 +216,9 @@ class DdlToCatalogCommandConverter {
                 .name(def.name())
                 .type(TypeUtils.columnType(def.type()))
                 .nullable(def.nullable())
+                .precision(def.precision())
+                .scale(def.scale())
+                .length(def.precision())
                 .defaultValue(convert(def.defaultValueDefinition()))
                 .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 ab52605ca2..9aa9471037 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
@@ -31,6 +31,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
 import static org.mockito.Mockito.when;
@@ -46,6 +48,7 @@ import java.util.function.Consumer;
 import java.util.function.LongFunction;
 import org.apache.ignite.internal.baseline.BaselineManager;
 import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 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;
@@ -279,9 +282,13 @@ public class MockedStructuresTest extends IgniteAbstractTest {
 
         schemaManager.start();
 
+        //TODO IGNITE-19082 drop mocked catalog manager.
         catalogManager = mock(CatalogManager.class);
+        CatalogTableDescriptor descriptor = mock(CatalogTableDescriptor.class);
+        when(descriptor.id()).thenReturn(1);
         when(catalogManager.createTable(any())).thenReturn(completedFuture(null));
         when(catalogManager.dropTable(any())).thenReturn(completedFuture(null));
+        when(catalogManager.table(anyString(), anyLong())).thenReturn(descriptor);
 
         cmgMgr = mock(ClusterManagementGroupManager.class);
 
@@ -585,6 +592,7 @@ public class MockedStructuresTest extends IgniteAbstractTest {
                 dataStorageManager,
                 workDir,
                 msm,
+                catalogManager,
                 schemaManager,
                 null,
                 clock,
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index aa419d043f..4848390f79 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -25,6 +25,8 @@ import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.CompletableFuture.runAsync;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
 import static java.util.stream.Collectors.toList;
+import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
+import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_ZONE_NAME;
 import static org.apache.ignite.internal.causality.IncrementalVersionedValue.dependingOn;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.getZoneById;
 import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.partitionAssignments;
@@ -33,6 +35,7 @@ import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
 import static org.apache.ignite.internal.schema.CatalogDescriptorUtils.toTableDescriptor;
 import static org.apache.ignite.internal.schema.SchemaManager.INITIAL_SCHEMA_VERSION;
 import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationUtils.findTableView;
+import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.internal.util.IgniteUtils.shutdownAndAwaitTermination;
 import static org.apache.ignite.internal.utils.RebalanceUtil.ASSIGNMENTS_SWITCH_REDUCE_PREFIX;
@@ -42,6 +45,7 @@ import static org.apache.ignite.internal.utils.RebalanceUtil.extractPartitionNum
 import static org.apache.ignite.internal.utils.RebalanceUtil.extractTableId;
 import static org.apache.ignite.internal.utils.RebalanceUtil.pendingPartAssignmentsKey;
 import static org.apache.ignite.internal.utils.RebalanceUtil.stablePartAssignmentsKey;
+import static org.apache.ignite.lang.ErrorGroups.Sql.DROP_IDX_COLUMN_CONSTRAINT_ERR;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.io.IOException;
@@ -88,6 +92,12 @@ import org.apache.ignite.configuration.notifications.ConfigurationNotificationEv
 import org.apache.ignite.internal.affinity.AffinityUtils;
 import org.apache.ignite.internal.affinity.Assignment;
 import org.apache.ignite.internal.baseline.BaselineManager;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams;
+import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnParams;
+import org.apache.ignite.internal.catalog.commands.ColumnParams;
+import org.apache.ignite.internal.catalog.commands.CreateTableParams;
+import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.descriptors.CatalogDataStorageDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
@@ -126,10 +136,12 @@ import org.apache.ignite.internal.raft.storage.impl.LogStorageFactoryCreator;
 import org.apache.ignite.internal.replicator.ReplicaManager;
 import org.apache.ignite.internal.replicator.ReplicaService;
 import org.apache.ignite.internal.replicator.TablePartitionId;
+import org.apache.ignite.internal.schema.CatalogDescriptorUtils;
 import org.apache.ignite.internal.schema.SchemaManager;
 import org.apache.ignite.internal.schema.SchemaRegistry;
 import org.apache.ignite.internal.schema.configuration.ExtendedTableChange;
 import org.apache.ignite.internal.schema.configuration.GcConfiguration;
+import org.apache.ignite.internal.schema.configuration.PrimaryKeyView;
 import org.apache.ignite.internal.schema.configuration.TableChange;
 import org.apache.ignite.internal.schema.configuration.TableConfiguration;
 import org.apache.ignite.internal.schema.configuration.TableView;
@@ -186,6 +198,8 @@ import org.apache.ignite.internal.util.PendingComparableValuesTracker;
 import org.apache.ignite.internal.utils.RebalanceUtil;
 import org.apache.ignite.internal.vault.VaultManager;
 import org.apache.ignite.lang.ByteArray;
+import org.apache.ignite.lang.ColumnAlreadyExistsException;
+import org.apache.ignite.lang.ColumnNotFoundException;
 import org.apache.ignite.lang.DistributionZoneNotFoundException;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.IgniteExceptionUtils;
@@ -200,6 +214,7 @@ import org.apache.ignite.network.ClusterService;
 import org.apache.ignite.network.MessagingService;
 import org.apache.ignite.network.TopologyService;
 import org.apache.ignite.raft.jraft.storage.impl.VolatileRaftMetaStorage;
+import org.apache.ignite.sql.SqlException;
 import org.apache.ignite.table.Table;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -209,8 +224,6 @@ import org.jetbrains.annotations.TestOnly;
  * Table manager.
  */
 public class TableManager extends Producer<TableEvent, TableEventParameters> implements IgniteTablesInternal, IgniteComponent {
-    private static final String DEFAULT_SCHEMA_NAME = "PUBLIC";
-
     private static final long QUERY_DATA_NODES_COUNT_TIMEOUT = TimeUnit.SECONDS.toMillis(3);
 
     /** The logger. */
@@ -317,6 +330,9 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
     /** Schema manager. */
     private final SchemaManager schemaManager;
 
+    /** Catalog manager. */
+    private final CatalogManager catalogManager;
+
     private final LogStorageFactoryCreator volatileLogStorageFactoryCreator;
 
     /** Executor for scheduling retries of a rebalance. */
@@ -392,6 +408,7 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      * @param baselineMgr Baseline manager.
      * @param txManager Transaction manager.
      * @param dataStorageMgr Data storage manager.
+     * @param catalogManager Catalog manager.
      * @param schemaManager Schema manager.
      * @param volatileLogStorageFactoryCreator Creator for {@link org.apache.ignite.internal.raft.storage.LogStorageFactory} for
      *         volatile tables.
@@ -415,6 +432,7 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
             DataStorageManager dataStorageMgr,
             Path storagePath,
             MetaStorageManager metaStorageMgr,
+            CatalogManager catalogManager,
             SchemaManager schemaManager,
             LogStorageFactoryCreator volatileLogStorageFactoryCreator,
             HybridClock clock,
@@ -439,6 +457,7 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
         this.metaStorageMgr = metaStorageMgr;
         this.vaultManager = vaultManager;
         this.schemaManager = schemaManager;
+        this.catalogManager = catalogManager;
         this.volatileLogStorageFactoryCreator = volatileLogStorageFactoryCreator;
         this.clock = clock;
         this.outgoingSnapshotsManager = outgoingSnapshotsManager;
@@ -1345,7 +1364,7 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
     }
 
     /**
-     * Completes appropriate future to return result from API {@link TableManager#createTableAsync(String, String, Consumer)}.
+     * Completes appropriate future to return result from API {@link TableManager#createTableAsync(CreateTableParams)}.
      *
      * @param table Table.
      */
@@ -1475,19 +1494,59 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      *         </ul>
      * @see TableAlreadyExistsException
      */
+    @Deprecated
     public CompletableFuture<Table> createTableAsync(String name, String zoneName, Consumer<TableChange> tableInitChange) {
+        throw new UnsupportedOperationException("Method is no longer supported.");
+    }
+
+    /**
+     * Creates a new table from parameters.
+     *
+     * @param parameters Create table parameters.
+     * @return Future representing pending completion of the operation.
+     * @see TableAlreadyExistsException
+     */
+    @Deprecated(forRemoval = true)
+    public CompletableFuture<Table> createTableAsync(CreateTableParams parameters) {
         if (!busyLock.enterBusy()) {
             throw new IgniteException(new NodeStoppingException());
         }
         try {
-            return createTableAsyncInternal(name, zoneName, tableInitChange);
+            String tableName = parameters.tableName();
+            String zoneName = Objects.requireNonNullElse(parameters.zone(), DEFAULT_ZONE_NAME);
+
+            // Copied from DdlCommandHandler
+            Consumer<TableChange> tblChanger = tableChange -> {
+                tableChange.changeColumns(columnsChange -> {
+                    for (var col : parameters.columns()) {
+                        columnsChange.create(col.name(), columnChange -> CatalogDescriptorUtils.convertColumnDefinition(col, columnChange));
+                    }
+                });
+
+                var colocationKeys = parameters.colocationColumns();
+
+                if (nullOrEmpty(colocationKeys)) {
+                    colocationKeys = parameters.primaryKeyColumns();
+                }
+
+                var colocationKeys0 = colocationKeys;
+
+                tableChange.changePrimaryKey(pkChange -> pkChange.changeColumns(parameters.primaryKeyColumns().toArray(String[]::new))
+                        .changeColocationColumns(colocationKeys0.toArray(String[]::new)));
+            };
+
+            return catalogManager.createTable(parameters)
+                    .thenApply(ignore -> catalogManager.table(tableName, Long.MAX_VALUE).id())
+                    .thenCompose(tableId -> createTableAsyncInternal(tableId, tableName, zoneName, tblChanger));
         } finally {
             busyLock.leaveBusy();
         }
     }
 
-    /** See {@link #createTableAsync(String, String, Consumer)} for details. */
+    /** See {@link #createTableAsync(CreateTableParams)} for details. */
+    @Deprecated(forRemoval = true)
     private CompletableFuture<Table> createTableAsyncInternal(
+            int tableId,
             String name,
             String zoneName,
             Consumer<TableChange> tableInitChange
@@ -1538,6 +1597,7 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
 
                                                         try {
                                                             changeTablesConfigurationOnTableCreate(
+                                                                    tableId,
                                                                     name,
                                                                     zoneId,
                                                                     tableInitChange,
@@ -1573,12 +1633,14 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
     /**
      * Creates a new table in {@link TablesConfiguration}.
      *
+     * @param tableId Table id.
      * @param name Table name.
      * @param zoneId Distribution zone id.
      * @param tableInitChange Table changer.
      * @param tblFut Future representing pending completion of the table creation.
      */
     private void changeTablesConfigurationOnTableCreate(
+            int tableId,
             String name,
             int zoneId,
             Consumer<TableChange> tableInitChange,
@@ -1599,8 +1661,6 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
 
                     var extConfCh = ((ExtendedTableChange) tableChange);
 
-                    int tableId = tablesChange.globalIdCounter() + 1;
-
                     extConfCh.changeId(tableId);
 
                     tablesChange.changeGlobalIdCounter(tableId);
@@ -1643,12 +1703,46 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      *         </ul>
      * @see TableNotFoundException
      */
+    @Deprecated(forRemoval = true)
     public CompletableFuture<Void> alterTableAsync(String name, Function<TableChange, Boolean> tableChange) {
+        throw new UnsupportedOperationException("Method is no longer supported.");
+    }
+
+    /**
+     * Alters a cluster table and adds columns to the table.
+     *
+     * @param params Create column params.
+     * @return Future representing pending completion of the operation.
+     * @see TableNotFoundException
+     */
+    @Deprecated
+    public CompletableFuture<Void> alterTableAddColumnAsync(AlterTableAddColumnParams params) {
+        if (!busyLock.enterBusy()) {
+            throw new IgniteException(new NodeStoppingException());
+        }
+        try {
+            return catalogManager.addColumn(params)
+                    .thenCompose(ignore -> addColumnInternal(params.tableName(), params.columns()));
+        } finally {
+            busyLock.leaveBusy();
+        }
+    }
+
+    /**
+     * Alters a cluster table and drops columns from the table.
+     *
+     * @param params Drop column params.
+     * @return Future representing pending completion of the operation.
+     * @see TableNotFoundException
+     */
+    @Deprecated
+    public CompletableFuture<Void> alterTableDropColumnAsync(AlterTableDropColumnParams params) {
         if (!busyLock.enterBusy()) {
             throw new IgniteException(new NodeStoppingException());
         }
         try {
-            return alterTableAsyncInternal(name, tableChange);
+            return catalogManager.dropColumn(params)
+                    .thenCompose(ignore -> dropColumnInternal(params.tableName(), params.columns()));
         } finally {
             busyLock.leaveBusy();
         }
@@ -1738,18 +1832,33 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      *         </ul>
      * @see TableNotFoundException
      */
+    @Deprecated(forRemoval = true)
     public CompletableFuture<Void> dropTableAsync(String name) {
+        throw new UnsupportedOperationException("Method is no longer supported.");
+    }
+
+    /**
+     * Drops a table with the name specified. If appropriate table does not be found, a future will be completed with
+     * {@link TableNotFoundException}.
+     *
+     * @param params Drop table parameters.
+     * @return Future representing pending completion of the operation.
+     * @see TableNotFoundException
+     */
+    @Deprecated
+    public CompletableFuture<Void> dropTableAsync(DropTableParams params) {
         if (!busyLock.enterBusy()) {
             throw new IgniteException(new NodeStoppingException());
         }
         try {
-            return dropTableAsyncInternal(name);
+            return catalogManager.dropTable(params)
+                    .thenCompose(ignore -> dropTableAsyncInternal(params.tableName()));
         } finally {
             busyLock.leaveBusy();
         }
     }
 
-    /** See {@link #dropTableAsync(String)} for details. */
+    /** See {@link #dropTableAsync(DropTableParams)} for details. */
     private CompletableFuture<Void> dropTableAsyncInternal(String name) {
         return tableAsyncInternal(name).thenCompose(tbl -> {
             // In case of drop it's an optimization that allows not to fire drop-change-closure if there's no such
@@ -2758,4 +2867,79 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
 
         return new CatalogDataStorageDescriptor(config.name(), dataRegion);
     }
+
+    // Copied from DdlCommandHandler
+    @Deprecated(forRemoval = true)
+    private CompletableFuture<Void> addColumnInternal(String fullName, List<ColumnParams> columnParams) {
+        return alterTableAsyncInternal(
+                fullName,
+                chng -> {
+                    if (columnParams.isEmpty()) {
+                        return false;
+                    }
+
+                    chng.changeColumns(cols -> {
+                        Set<String> colNamesToOrders = new HashSet<>(cols.namedListKeys());
+
+                        columnParams.stream()
+                                .filter(k -> colNamesToOrders.contains(k.name()))
+                                .findAny()
+                                .ifPresent(c -> {
+                                    throw new ColumnAlreadyExistsException(c.name());
+                                });
+
+                        for (ColumnParams col : columnParams) {
+                            cols.create(col.name(), colChg -> CatalogDescriptorUtils.convertColumnDefinition(col, colChg));
+                        }
+                    });
+
+                    return true;
+                }
+        );
+    }
+
+    // Copied from DdlCommandHandler
+    // TODO: IGNITE-19082 Drop unused temporary method.
+    @Deprecated(forRemoval = true)
+    private CompletableFuture<Void> dropColumnInternal(String tableName, Set<String> colNames) {
+        AtomicBoolean ret = new AtomicBoolean(true);
+
+        return alterTableAsyncInternal(
+                tableName,
+                chng -> {
+                    chng.changeColumns(cols -> {
+                        ret.set(true); // Reset state if closure have been restarted.
+
+                        PrimaryKeyView priKey = chng.primaryKey();
+
+                        Set<String> colNamesToOrders = new HashSet<>(cols.namedListKeys());
+
+                        Set<String> colNames0 = new HashSet<>();
+
+                        Set<String> primaryCols = Set.of(priKey.columns());
+
+                        // Catalog verification passe, so we can omit validation here.
+                        // reportIndexedColumns(tableName, colNames, primaryCols);
+
+                        for (String colName : colNames) {
+                            if (!colNamesToOrders.contains(colName)) {
+                                ret.set(false);
+
+                                throw new ColumnNotFoundException(DEFAULT_SCHEMA_NAME, tableName, colName);
+                            } else {
+                                colNames0.add(colName);
+                            }
+
+                            if (primaryCols.contains(colName)) {
+                                throw new SqlException(DROP_IDX_COLUMN_CONSTRAINT_ERR, IgniteStringFormatter
+                                        .format("Can`t delete column, belongs to primary key: [name={}]", colName));
+                            }
+                        }
+
+                        colNames0.forEach(cols::delete);
+                    });
+
+                    return ret.get();
+                });
+    }
 }
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
index 898358beeb..883c0bf771 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
@@ -37,6 +37,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
@@ -60,11 +62,13 @@ import java.util.concurrent.Flow.Subscription;
 import java.util.concurrent.Phaser;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
-import java.util.function.Function;
 import java.util.function.LongFunction;
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.internal.affinity.AffinityUtils;
 import org.apache.ignite.internal.baseline.BaselineManager;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams;
+import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager;
@@ -77,8 +81,6 @@ import org.apache.ignite.internal.configuration.testframework.InjectRevisionList
 import org.apache.ignite.internal.distributionzones.DistributionZoneManager;
 import org.apache.ignite.internal.distributionzones.configuration.DistributionZonesConfiguration;
 import org.apache.ignite.internal.hlc.HybridClockImpl;
-import org.apache.ignite.internal.logger.IgniteLogger;
-import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.metastorage.MetaStorageManager;
 import org.apache.ignite.internal.metastorage.dsl.Operation;
 import org.apache.ignite.internal.raft.Loza;
@@ -93,10 +95,10 @@ import org.apache.ignite.internal.schema.SchemaManager;
 import org.apache.ignite.internal.schema.SchemaUtils;
 import org.apache.ignite.internal.schema.configuration.ExtendedTableChange;
 import org.apache.ignite.internal.schema.configuration.GcConfiguration;
-import org.apache.ignite.internal.schema.configuration.TableChange;
 import org.apache.ignite.internal.schema.configuration.TableView;
 import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaToCatalogParamsConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
@@ -143,8 +145,6 @@ import org.mockito.quality.Strictness;
 @ExtendWith({MockitoExtension.class, ConfigurationExtension.class})
 @MockitoSettings(strictness = Strictness.LENIENT)
 public class TableManagerTest extends IgniteAbstractTest {
-    private static final IgniteLogger LOG = Loggers.forClass(TableManagerTest.class);
-
     /** The name of the table which is preconfigured. */
     private static final String PRECONFIGURED_TABLE_NAME = "T1";
 
@@ -388,7 +388,7 @@ public class TableManagerTest extends IgniteAbstractTest {
 
         TableManager tableManager = tblManagerFut.join();
 
-        await(tableManager.dropTableAsync(DYNAMIC_TABLE_FOR_DROP_NAME));
+        await(tableManager.dropTableAsync(DropTableParams.builder().schemaName("PUBLIC").tableName(DYNAMIC_TABLE_FOR_DROP_NAME).build()));
 
         verify(mvTableStorage).destroy();
         verify(txStateTableStorage).destroy();
@@ -413,33 +413,33 @@ public class TableManagerTest extends IgniteAbstractTest {
 
         createDistributionZone();
 
-        Consumer<TableChange> createTableChange = (TableChange change) ->
-                SchemaConfigurationConverter.convert(SchemaBuilders.tableBuilder("PUBLIC", DYNAMIC_TABLE_FOR_DROP_NAME).columns(
-                                SchemaBuilders.column("key", ColumnType.INT64).build(),
-                                SchemaBuilders.column("val", ColumnType.INT64).asNullable(true).build()
-                        ).withPrimaryKey("key").build(), change);
-
-        Function<TableChange, Boolean> addColumnChange = (TableChange change) -> {
-            change.changeColumns(cols -> {
-                int colIdx = change.columns().namedListKeys().stream().mapToInt(Integer::parseInt).max().getAsInt() + 1;
-
-                cols.create(String.valueOf(colIdx),
-                        colChg -> SchemaConfigurationConverter.convert(SchemaBuilders.column("name", ColumnType.string()).build(),
-                                colChg));
-
-            });
+        TableDefinition tableDef = SchemaBuilders.tableBuilder("PUBLIC", DYNAMIC_TABLE_FOR_DROP_NAME)
+                .columns(
+                        SchemaBuilders.column("key", ColumnType.INT64).build(),
+                        SchemaBuilders.column("val", ColumnType.INT64).asNullable(true).build()
+                )
+                .withPrimaryKey("key")
+                .build();
 
-            return true;
-        };
+        AlterTableAddColumnParams addColumnParams = AlterTableAddColumnParams.builder()
+                .schemaName("PUBLIC")
+                .tableName(DYNAMIC_TABLE_FOR_DROP_NAME)
+                .columns(List.of(
+                       SchemaToCatalogParamsConverter.convert(SchemaBuilders.column("name", ColumnType.string()).build())
+                ))
+                .build();
 
         TableManager igniteTables = tableManager;
 
         assertThrows(IgniteException.class,
-                () -> igniteTables.createTableAsync(DYNAMIC_TABLE_FOR_DROP_NAME, ZONE_NAME, createTableChange));
+                () -> igniteTables.createTableAsync(SchemaToCatalogParamsConverter.toCreateTable(ZONE_NAME, tableDef)));
 
-        assertThrows(IgniteException.class, () -> igniteTables.alterTableAsync(DYNAMIC_TABLE_FOR_DROP_NAME, addColumnChange));
+        assertThrows(IgniteException.class, () -> igniteTables.alterTableAddColumnAsync(addColumnParams));
 
-        assertThrows(IgniteException.class, () -> igniteTables.dropTableAsync(DYNAMIC_TABLE_FOR_DROP_NAME));
+        assertThrows(IgniteException.class, () -> igniteTables.dropTableAsync(DropTableParams.builder()
+                .schemaName(tableDef.schemaName())
+                .tableName(tableDef.name())
+                .build()));
 
         assertThrows(IgniteException.class, () -> igniteTables.tables());
         assertThrows(IgniteException.class, () -> igniteTables.tablesAsync());
@@ -632,8 +632,9 @@ public class TableManagerTest extends IgniteAbstractTest {
         assertNotNull(table);
 
         assertThrows(RuntimeException.class,
-                () -> await(tblManagerFut.join().createTableAsync(DYNAMIC_TABLE_NAME, ZONE_NAME,
-                        tblCh -> SchemaConfigurationConverter.convert(scmTbl, tblCh))));
+                () -> await(tblManagerFut.join().createTableAsync(
+                        SchemaToCatalogParamsConverter.toCreateTable(ZONE_NAME, scmTbl)
+                )));
 
         assertSame(table, tblManagerFut.join().table(scmTbl.name()));
     }
@@ -822,8 +823,8 @@ public class TableManagerTest extends IgniteAbstractTest {
 
         createDistributionZone();
 
-        CompletableFuture<Table> tbl2Fut = tableManager.createTableAsync(tableDefinition.name(), ZONE_NAME,
-                tblCh -> SchemaConfigurationConverter.convert(tableDefinition, tblCh)
+        CompletableFuture<Table> tbl2Fut = tableManager.createTableAsync(
+                SchemaToCatalogParamsConverter.toCreateTable(ZONE_NAME, tableDefinition)
         );
 
         assertTrue(createTblLatch.await(10, TimeUnit.SECONDS));
@@ -857,6 +858,14 @@ public class TableManagerTest extends IgniteAbstractTest {
         when(vaultManager.get(any(ByteArray.class))).thenReturn(completedFuture(null));
         when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(completedFuture(null));
 
+        //TODO IGNITE-19082 drop mocked catalog manager.
+        CatalogManager catalogManager = mock(CatalogManager.class);
+        CatalogTableDescriptor tableDescriptor = mock(CatalogTableDescriptor.class);
+        when(catalogManager.createTable(any())).thenReturn(completedFuture(null));
+        when(catalogManager.dropTable(any())).thenReturn(completedFuture(null));
+        when(catalogManager.table(anyString(), anyLong())).thenReturn(tableDescriptor);
+        when(tableDescriptor.id()).thenReturn(1);
+
         TableManager tableManager = new TableManager(
                 "test",
                 revisionUpdater,
@@ -874,6 +883,7 @@ public class TableManagerTest extends IgniteAbstractTest {
                 dsm = createDataStorageManager(configRegistry, workDir, storageEngineConfig),
                 workDir,
                 msm,
+                catalogManager,
                 sm = new SchemaManager(revisionUpdater, tblsCfg, msm),
                 budgetView -> new LocalLogStorageFactory(),
                 new HybridClockImpl(),


[ignite-3] 03/06: Mirror Index changes from Config to Catalog

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a21adc78b275af3eceea3c8fa96e2798dcf53db9
Author: amashenkov <an...@gmail.com>
AuthorDate: Tue Jul 11 19:30:31 2023 +0300

    Mirror Index changes from Config to Catalog
---
 .../internal/catalog/commands/CatalogUtils.java    |   1 -
 .../apache/ignite/internal/index/IndexManager.java | 139 ++++++++++++++++++++-
 .../ignite/internal/index/IndexManagerTest.java    |  90 +++++++++----
 .../ignite/internal/index/ItIndexManagerTest.java  |  23 ++--
 .../runner/app/ItIgniteNodeRestartTest.java        |   8 +-
 .../org/apache/ignite/internal/app/IgniteImpl.java |   2 +-
 .../sql/engine/exec/ddl/DdlCommandHandler.java     |   2 +-
 .../engine/exec/ddl/DdlCommandHandlerWrapper.java  |  37 +++---
 .../sql/engine/exec/MockedStructuresTest.java      |  17 ++-
 .../internal/table/distributed/TableManager.java   |   8 +-
 .../table/distributed/TableManagerTest.java        |  11 +-
 11 files changed, 271 insertions(+), 67 deletions(-)

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 d157cbaba2..7d53598e23 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
@@ -208,5 +208,4 @@ public class CatalogUtils {
                 return 0;
         }
     }
-
 }
diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
index a9bbdf6c45..2944ef3f6e 100644
--- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
+++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
@@ -36,6 +36,10 @@ import java.util.function.Function;
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.configuration.notifications.ConfigurationNamedListListener;
 import org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
+import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
+import org.apache.ignite.internal.catalog.commands.DropIndexParams;
 import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
 import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexColumnDescriptor;
@@ -59,6 +63,7 @@ import org.apache.ignite.internal.schema.configuration.TableView;
 import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import org.apache.ignite.internal.schema.configuration.TablesView;
 import org.apache.ignite.internal.schema.configuration.index.HashIndexChange;
+import org.apache.ignite.internal.schema.configuration.index.SortedIndexChange;
 import org.apache.ignite.internal.schema.configuration.index.TableIndexChange;
 import org.apache.ignite.internal.schema.configuration.index.TableIndexConfiguration;
 import org.apache.ignite.internal.schema.configuration.index.TableIndexView;
@@ -73,6 +78,7 @@ import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 import org.apache.ignite.internal.util.StringUtils;
 import org.apache.ignite.lang.ErrorGroups;
 import org.apache.ignite.lang.ErrorGroups.Common;
+import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.apache.ignite.lang.IndexAlreadyExistsException;
 import org.apache.ignite.lang.IndexNotFoundException;
@@ -96,6 +102,9 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
     /** Table manager. */
     private final TableManager tableManager;
 
+    /** Catalog manager. */
+    private final CatalogManager catalogManager;
+
     /** Busy lock to stop synchronously. */
     private final IgniteSpinBusyLock busyLock = new IgniteSpinBusyLock();
 
@@ -106,17 +115,20 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
      * Constructor.
      *
      * @param tablesCfg Tables and indexes configuration.
+     * @param catalogManager Catalog manager.
      * @param schemaManager Schema manager.
      * @param tableManager Table manager.
      */
     public IndexManager(
             TablesConfiguration tablesCfg,
+            CatalogManager catalogManager,
             SchemaManager schemaManager,
             TableManager tableManager
     ) {
         this.tablesCfg = Objects.requireNonNull(tablesCfg, "tablesCfg");
         this.schemaManager = Objects.requireNonNull(schemaManager, "schemaManager");
         this.tableManager = tableManager;
+        this.catalogManager = catalogManager;
     }
 
     /** {@inheritDoc} */
@@ -142,8 +154,10 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
                                 .toArray(String[]::new);
 
                         String pkName = table.name() + "_PK";
+                        int pkId = table.tableId() + 1;
 
-                        return createIndexAsync("PUBLIC", pkName, table.name(), false,
+                        // Update config bypassing the Catalog, because PK has just been created in Catalog with the table.
+                        return createIndexInternal(pkId, "PUBLIC", pkName, table.name(), false,
                                 change -> change.changeUniq(true).convert(HashIndexChange.class)
                                         .changeColumnNames(pkColumns)
                         );
@@ -186,12 +200,104 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
      * @param indexChange A consumer that suppose to change the configuration in order to provide description of an index.
      * @return A future represented the result of creation.
      */
+    @Deprecated(forRemoval = true)
     public CompletableFuture<Boolean> createIndexAsync(
             String schemaName,
             String indexName,
             String tableName,
             boolean failIfExists,
             Consumer<TableIndexChange> indexChange
+    ) {
+        throw new UnsupportedOperationException("Method is no longer supported.");
+    }
+
+    /**
+     * Creates sorted index from provided parameters.
+     */
+    @Deprecated(forRemoval = true)
+    public CompletableFuture<Boolean> createSortedIndexAsync(CreateSortedIndexParams params) {
+        if (!busyLock.enterBusy()) {
+            return failedFuture(new NodeStoppingException());
+        }
+
+        try {
+            Consumer<TableIndexChange> indexChanger = tableIndexChange -> {
+                tableIndexChange.convert(SortedIndexChange.class).changeColumns(colsInit -> {
+                    for (int i = 0; i < params.columns().size(); i++) {
+                        String columnName = params.columns().get(i);
+                        CatalogColumnCollation collation = params.collations().get(i);
+                        //TODO: https://issues.apache.org/jira/browse/IGNITE-17563 Pass null ordering for columns.
+                        colsInit.create(columnName, colInit -> colInit.changeAsc(collation.asc()));
+                    }
+                });
+            };
+
+            return catalogManager.createIndex(params)
+                    .thenApply(ignore -> {
+                        CatalogIndexDescriptor index = catalogManager.index(params.indexName(), Long.MAX_VALUE);
+                        return index.id();
+                    })
+                    .thenCompose(indexId ->
+                            createIndexInternal(
+                                    indexId,
+                                    params.schemaName(),
+                                    params.indexName(),
+                                    params.tableName(),
+                                    true,
+                                    indexChanger
+                            )
+                    );
+        } catch (Exception ex) {
+            return failedFuture(ex);
+        } finally {
+            busyLock.leaveBusy();
+        }
+    }
+
+    /**
+     * Creates hash index from provided parameters.
+     */
+    @Deprecated(forRemoval = true)
+    public CompletableFuture<Boolean> createHashIndexAsync(CreateHashIndexParams params) {
+        if (!busyLock.enterBusy()) {
+            return failedFuture(new NodeStoppingException());
+        }
+
+        try {
+            Consumer<TableIndexChange> indexChanger = tableIndexChange -> {
+                tableIndexChange.convert(HashIndexChange.class)
+                        .changeColumnNames(params.columns().toArray(STRING_EMPTY_ARRAY));
+            };
+
+            return catalogManager.createIndex(params)
+                    .thenApply(ignore -> {
+                        CatalogIndexDescriptor index = catalogManager.index(params.indexName(), Long.MAX_VALUE);
+                        return index.id();
+                    })
+                    .thenCompose(indexId ->
+                            createIndexInternal(
+                                    indexId,
+                                    params.schemaName(),
+                                    params.indexName(),
+                                    params.tableName(),
+                                    true,
+                                    indexChanger
+                            )
+                    );
+        } catch (Exception ex) {
+            return failedFuture(ex);
+        } finally {
+            busyLock.leaveBusy();
+        }
+    }
+
+    private CompletableFuture<Boolean> createIndexInternal(
+            int indexId,
+            String schemaName,
+            String indexName,
+            String tableName,
+            boolean failIfExists,
+            Consumer<TableIndexChange> indexChange
     ) {
         if (!busyLock.enterBusy()) {
             return failedFuture(new NodeStoppingException());
@@ -224,8 +330,6 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
 
                 int tableId = tableCfg.id();
 
-                int indexId = tablesChange.globalIdCounter() + 1;
-
                 tablesChange.changeGlobalIdCounter(indexId);
 
                 Consumer<TableIndexChange> chg = indexChange.andThen(c -> c.changeTableId(tableId).changeId(indexId));
@@ -281,6 +385,33 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
             String schemaName,
             String indexName,
             boolean failIfNotExists
+    ) {
+        throw new UnsupportedOperationException("Method is no longer supported.");
+    }
+
+    /**
+     * Drops the index with a given parameters asynchronously.
+     */
+    public CompletableFuture<Boolean> dropIndexAsync(DropIndexParams params) {
+        if (!busyLock.enterBusy()) {
+            throw new IgniteException(new NodeStoppingException());
+        }
+        try {
+            CompletableFuture<Boolean> future = catalogManager.dropIndex(params)
+                    .thenCompose(ignore -> dropIndexAsyncInternal(params.schemaName(), params.indexName(), true));
+
+            future.whenComplete((res, ex) -> ex.printStackTrace());
+
+            return future;
+        } finally {
+            busyLock.leaveBusy();
+        }
+    }
+
+    private CompletableFuture<Boolean> dropIndexAsyncInternal(
+            String schemaName,
+            String indexName,
+            boolean failIfNotExists
     ) {
         if (!busyLock.enterBusy()) {
             return failedFuture(new NodeStoppingException());
@@ -325,6 +456,8 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
             });
 
             return future;
+        } catch (Exception ex) {
+            return failedFuture(ex);
         } finally {
             busyLock.leaveBusy();
         }
diff --git a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
index 8230656614..40fb2c13f7 100644
--- a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
+++ b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
@@ -27,8 +27,10 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -38,6 +40,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
+import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
+import org.apache.ignite.internal.catalog.commands.DropIndexParams;
+import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
+import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
 import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.configuration.tree.ConverterToMapVisitor;
@@ -47,7 +55,6 @@ import org.apache.ignite.internal.index.event.IndexEventParameters;
 import org.apache.ignite.internal.schema.SchemaManager;
 import org.apache.ignite.internal.schema.configuration.ExtendedTableChange;
 import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
-import org.apache.ignite.internal.schema.configuration.index.SortedIndexChange;
 import org.apache.ignite.internal.schema.configuration.index.TableIndexView;
 import org.apache.ignite.internal.table.InternalTable;
 import org.apache.ignite.internal.table.TableImpl;
@@ -104,7 +111,16 @@ public class IndexManagerTest {
 
         when(schManager.schemaRegistry(anyLong(), anyInt())).thenReturn(completedFuture(null));
 
-        indexManager = new IndexManager(tablesConfig, schManager, tableManagerMock);
+        //TODO IGNITE-19082 drop mocked catalog manager.
+        CatalogManager catalogManager = mock(CatalogManager.class);
+        CatalogIndexDescriptor indexDescriptor = mock(CatalogIndexDescriptor.class);
+        when(catalogManager.createIndex(any(CreateHashIndexParams.class))).thenReturn(completedFuture(null));
+        when(catalogManager.createIndex(any(CreateSortedIndexParams.class))).thenReturn(completedFuture(null));
+        when(catalogManager.dropIndex(any())).thenReturn(completedFuture(null));
+        when(catalogManager.index(anyString(), anyLong())).thenReturn(indexDescriptor);
+        when(indexDescriptor.id()).thenReturn(1);
+
+        indexManager = new IndexManager(tablesConfig, catalogManager, schManager, tableManagerMock);
         indexManager.start();
 
         assertThat(
@@ -125,16 +141,14 @@ public class IndexManagerTest {
     void configurationChangedWhenCreateIsInvoked() {
         String indexName = "idx";
 
-        assertThat(indexManager.createIndexAsync("sName", indexName, "tName", true, indexChange -> {
-            SortedIndexChange sortedIndexChange = indexChange.convert(SortedIndexChange.class);
-
-            sortedIndexChange.changeColumns(columns -> {
-                columns.create("c1", columnChange -> columnChange.changeAsc(true));
-                columns.create("c2", columnChange -> columnChange.changeAsc(false));
-            });
-
-            sortedIndexChange.changeTableId(tableId());
-        }), willCompleteSuccessfully());
+        assertThat(indexManager.createSortedIndexAsync(
+                CreateSortedIndexParams.builder()
+                        .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
+                        .tableName("tName")
+                        .indexName(indexName)
+                        .columns(List.of("c1", "c2"))
+                        .collations(List.of(CatalogColumnCollation.ASC_NULLS_LAST, CatalogColumnCollation.DESC_NULLS_FIRST))
+                        .build()), willCompleteSuccessfully());
 
         var expected = List.of(
                 Map.of(
@@ -162,7 +176,24 @@ public class IndexManagerTest {
     @Test
     public void createIndexWithEmptyName() {
         assertThat(
-                indexManager.createIndexAsync("sName", "", "tName", true, indexChange -> {/* doesn't matter */}),
+                indexManager.createHashIndexAsync(
+                        CreateHashIndexParams.builder()
+                                .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
+                                .tableName("tName")
+                                .indexName("")
+                                .columns(List.of("c1"))
+                                .build()),
+                willThrowFast(IgniteInternalException.class, "Index name should be at least 1 character long")
+        );
+
+        assertThat(
+                indexManager.createSortedIndexAsync(
+                        CreateSortedIndexParams.builder()
+                                .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
+                                .tableName("tName")
+                                .indexName("")
+                                .columns(List.of("c1"))
+                                .build()),
                 willThrowFast(IgniteInternalException.class, "Index name should be at least 1 character long")
         );
     }
@@ -170,8 +201,12 @@ public class IndexManagerTest {
     @Test
     public void dropNonExistingIndex() {
         assertThat(
-                indexManager.dropIndexAsync("sName", "nonExisting", true),
-                willThrowFast(IndexNotFoundException.class, "Index does not exist [name=\"sName\".\"nonExisting\"]")
+                indexManager.dropIndexAsync(
+                        DropIndexParams.builder()
+                                .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
+                                .indexName("nonExisting")
+                                .build()),
+                willThrowFast(IndexNotFoundException.class, "Index does not exist [name=\"PUBLIC\".\"nonExisting\"]")
         );
     }
 
@@ -194,15 +229,15 @@ public class IndexManagerTest {
             return completedFuture(true);
         });
 
-        assertThat(indexManager.createIndexAsync("sName", indexName, "tName", true, indexChange -> {
-            SortedIndexChange sortedIndexChange = indexChange.convert(SortedIndexChange.class);
-
-            sortedIndexChange.changeColumns(columns -> {
-                columns.create("c2", columnChange -> columnChange.changeAsc(true));
-            });
-
-            sortedIndexChange.changeTableId(tableId());
-        }), willCompleteSuccessfully());
+        assertThat(indexManager.createSortedIndexAsync(
+                        CreateSortedIndexParams.builder()
+                                .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
+                                .indexName(indexName)
+                                .tableName("tName")
+                                .columns(List.of("c2"))
+                                .collations(List.of(CatalogColumnCollation.ASC_NULLS_LAST))
+                                .build()),
+                willCompleteSuccessfully());
 
         List<Integer> indexIds = tablesConfig.indexes().value().stream()
                 .map(TableIndexView::id)
@@ -217,7 +252,12 @@ public class IndexManagerTest {
         assertThat(holder.get().tableId(), equalTo(tableId()));
         assertThat(holder.get().indexDescriptor().name(), equalTo(indexName));
 
-        assertThat(indexManager.dropIndexAsync("sName", indexName, true), willCompleteSuccessfully());
+        assertThat(indexManager.dropIndexAsync(
+                DropIndexParams.builder()
+                        .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
+                        .indexName(indexName)
+                        .build()),
+                willCompleteSuccessfully());
 
         assertThat(holder.get(), notNullValue());
         assertThat(holder.get().indexId(), equalTo(indexId));
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
index e511cac7c0..3c7eca2188 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
@@ -23,12 +23,14 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasItems;
 import static org.hamcrest.Matchers.notNullValue;
 
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.app.IgniteImpl;
+import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
+import org.apache.ignite.internal.catalog.commands.DropIndexParams;
 import org.apache.ignite.internal.index.event.IndexEvent;
 import org.apache.ignite.internal.index.event.IndexEventParameters;
-import org.apache.ignite.internal.schema.configuration.index.HashIndexChange;
 import org.apache.ignite.internal.sql.engine.ClusterPerClassIntegrationTest;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -68,12 +70,13 @@ public class ItIndexManagerTest extends ClusterPerClassIntegrationTest {
 
         CompletableFuture<IndexEventParameters> indexCreatedFuture = registerListener(indexManager, IndexEvent.CREATE);
 
-        await(indexManager.createIndexAsync(
-                "PUBLIC",
-                "INAME",
-                "TNAME",
-                true,
-                tableIndexChange -> tableIndexChange.convert(HashIndexChange.class).changeColumnNames("C3", "C2")
+        await(indexManager.createHashIndexAsync(
+                CreateHashIndexParams.builder()
+                        .schemaName("PUBLIC")
+                        .indexName("INAME")
+                        .tableName("TNAME")
+                        .columns(List.of("C3", "C2"))
+                        .build()
                 ));
 
         int createdIndexId;
@@ -90,7 +93,11 @@ public class ItIndexManagerTest extends ClusterPerClassIntegrationTest {
 
         CompletableFuture<IndexEventParameters> indexDroppedFuture = registerListener(indexManager, IndexEvent.DROP);
 
-        await(indexManager.dropIndexAsync("PUBLIC", "INAME", true));
+        await(indexManager.dropIndexAsync(
+                DropIndexParams.builder()
+                        .schemaName("PUBLIC")
+                        .indexName("INAME")
+                        .build()));
 
         {
             IndexEventParameters params = await(indexDroppedFuture);
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index 45bc03c3a4..10b9f15fb1 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -385,7 +385,7 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
                 null
         );
 
-        var indexManager = new IndexManager(tablesConfig, schemaManager, tableManager);
+        var indexManager = new IndexManager(tablesConfig, catalogManager, schemaManager, tableManager);
 
         SqlQueryProcessor qryEngine = new SqlQueryProcessor(
                 registry,
@@ -1204,9 +1204,9 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
      */
     private void createTableWithData(List<IgniteImpl> nodes, String name, int replicas, int partitions) {
         try (Session session = nodes.get(0).sql().createSession()) {
-            session.execute(null,
-                    String.format("CREATE ZONE IF NOT EXISTS ZONE_%s WITH REPLICAS=%d, PARTITIONS=%d", name, replicas, partitions));
-            session.execute(null, "CREATE TABLE IF NOT EXISTS " + name
+            session.execute(null, String.format("CREATE ZONE IF NOT EXISTS ZONE_%s WITH REPLICAS=%d, PARTITIONS=%d",
+                            name.toUpperCase(), replicas, partitions));
+            session.execute(null, "CREATE TABLE IF NOT EXISTS " + name.toUpperCase()
                     + "(id INT PRIMARY KEY, name VARCHAR) WITH PRIMARY_ZONE='ZONE_" + name.toUpperCase() + "';");
 
             for (int i = 0; i < 100; i++) {
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index c88c78b8ac..324c7f117c 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -549,7 +549,7 @@ public class IgniteImpl implements Ignite {
                 distributionZoneManager
         );
 
-        indexManager = new IndexManager(tablesConfig, schemaManager, distributedTblMgr);
+        indexManager = new IndexManager(tablesConfig, catalogManager, schemaManager, distributedTblMgr);
 
         qryEngine = new SqlQueryProcessor(
                 registry,
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
index f56848c215..5760dc2a85 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
@@ -106,7 +106,7 @@ public class DdlCommandHandler {
 
     protected final TableManager tableManager;
 
-    private final IndexManager indexManager;
+    protected final IndexManager indexManager;
 
     private final DataStorageManager dataStorageManager;
 
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 bb702d4566..7fbd884f9b 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
@@ -17,6 +17,9 @@
 
 package org.apache.ignite.internal.sql.engine.exec.ddl;
 
+import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.lang.ErrorGroups.Sql.UNSUPPORTED_DDL_OPERATION_ERR;
+
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.catalog.CatalogManager;
@@ -35,6 +38,7 @@ import org.apache.ignite.internal.sql.engine.prepare.ddl.DropIndexCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DropTableCommand;
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.table.distributed.TableManager;
+import org.apache.ignite.lang.IgniteInternalCheckedException;
 import org.apache.ignite.lang.IndexAlreadyExistsException;
 import org.apache.ignite.lang.IndexNotFoundException;
 import org.apache.ignite.lang.TableAlreadyExistsException;
@@ -86,28 +90,25 @@ public class DdlCommandHandlerWrapper extends DdlCommandHandler {
         } else if (cmd instanceof AlterColumnCommand) {
             return catalogManager.alterColumn(DdlToCatalogCommandConverter.convert((AlterColumnCommand) cmd))
                     .handle(handleModificationResult(((AlterColumnCommand) cmd).ifTableExists(), TableNotFoundException.class));
-        }
+        } else if (cmd instanceof CreateIndexCommand) {
+            AbstractIndexCommandParams params = DdlToCatalogCommandConverter.convert((CreateIndexCommand) cmd);
 
-        // Handle command in usual way.
-        CompletableFuture<Boolean> ddlCommandFuture = super.handle(cmd);
+            if (params instanceof CreateSortedIndexParams) {
+                return indexManager.createSortedIndexAsync((CreateSortedIndexParams) params)
+                        .handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class));
+            } else if (params instanceof CreateHashIndexParams) {
+                return indexManager.createHashIndexAsync((CreateHashIndexParams) params)
+                        .handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class));
+            }
 
-        if (cmd instanceof CreateIndexCommand) {
-            return ddlCommandFuture
-                    .thenCompose(res -> {
-                        AbstractIndexCommandParams params = DdlToCatalogCommandConverter.convert((CreateIndexCommand) cmd);
-                        if (params instanceof CreateSortedIndexParams) {
-                            return catalogManager.createIndex((CreateSortedIndexParams) params);
-                        } else {
-                            return catalogManager.createIndex((CreateHashIndexParams) params);
-                        }
-                    }).handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class));
+            return failedFuture(new IgniteInternalCheckedException(UNSUPPORTED_DDL_OPERATION_ERR, "Unsupported DDL operation ["
+                    + "cmdName=" + cmd.getClass().getSimpleName() + "]"));
         } else if (cmd instanceof DropIndexCommand) {
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.dropIndex(DdlToCatalogCommandConverter.convert((DropIndexCommand) cmd))
-                            .handle(handleModificationResult(((DropIndexCommand) cmd).ifNotExists(), IndexNotFoundException.class))
-                    );
+            return indexManager.dropIndexAsync(DdlToCatalogCommandConverter.convert((DropIndexCommand) cmd))
+                    .handle(handleModificationResult(((DropIndexCommand) cmd).ifNotExists(), IndexNotFoundException.class));
         }
 
-        return ddlCommandFuture;
+        // Handle other commands in usual way.
+        return super.handle(cmd);
     }
 }
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 9aa9471037..955a4223c2 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
@@ -48,6 +48,9 @@ import java.util.function.Consumer;
 import java.util.function.LongFunction;
 import org.apache.ignite.internal.baseline.BaselineManager;
 import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
+import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
+import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologySnapshot;
@@ -284,11 +287,17 @@ public class MockedStructuresTest extends IgniteAbstractTest {
 
         //TODO IGNITE-19082 drop mocked catalog manager.
         catalogManager = mock(CatalogManager.class);
-        CatalogTableDescriptor descriptor = mock(CatalogTableDescriptor.class);
-        when(descriptor.id()).thenReturn(1);
+        CatalogTableDescriptor tableDescriptor = mock(CatalogTableDescriptor.class);
+        CatalogIndexDescriptor indexDescriptor = mock(CatalogIndexDescriptor.class);
+        when(tableDescriptor.id()).thenReturn(1);
+        when(indexDescriptor.id()).thenReturn(1);
         when(catalogManager.createTable(any())).thenReturn(completedFuture(null));
+        when(catalogManager.createIndex(any(CreateHashIndexParams.class))).thenReturn(completedFuture(null));
+        when(catalogManager.createIndex(any(CreateSortedIndexParams.class))).thenReturn(completedFuture(null));
         when(catalogManager.dropTable(any())).thenReturn(completedFuture(null));
-        when(catalogManager.table(anyString(), anyLong())).thenReturn(descriptor);
+        when(catalogManager.dropIndex(any())).thenReturn(completedFuture(null));
+        when(catalogManager.table(anyString(), anyLong())).thenReturn(tableDescriptor);
+        when(catalogManager.index(anyString(), anyLong())).thenReturn(indexDescriptor);
 
         cmgMgr = mock(ClusterManagementGroupManager.class);
 
@@ -304,7 +313,7 @@ public class MockedStructuresTest extends IgniteAbstractTest {
 
         tblManager = mockManagers();
 
-        idxManager = new IndexManager(tblsCfg, schemaManager, tblManager);
+        idxManager = new IndexManager(tblsCfg, catalogManager, schemaManager, tblManager);
 
         idxManager.start();
 
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index 4848390f79..7ed2bb896f 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -1748,7 +1748,13 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
         }
     }
 
-    /** See {@link #alterTableAsync(String, Function)} for details. */
+    /**
+     * Alter table configuration.
+     *
+     * @see AlterTableAddColumnParams
+     * @see AlterTableDropColumnParams
+     */
+    @Deprecated(forRemoval = true)
     private CompletableFuture<Void> alterTableAsyncInternal(String name, Function<TableChange, Boolean> tableChange) {
         CompletableFuture<Void> tblFut = new CompletableFuture<>();
 
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
index 883c0bf771..83b5e6f5ff 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
@@ -68,7 +68,10 @@ import org.apache.ignite.internal.affinity.AffinityUtils;
 import org.apache.ignite.internal.baseline.BaselineManager;
 import org.apache.ignite.internal.catalog.CatalogManager;
 import org.apache.ignite.internal.catalog.commands.AlterTableAddColumnParams;
+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.descriptors.CatalogIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager;
@@ -861,10 +864,16 @@ public class TableManagerTest extends IgniteAbstractTest {
         //TODO IGNITE-19082 drop mocked catalog manager.
         CatalogManager catalogManager = mock(CatalogManager.class);
         CatalogTableDescriptor tableDescriptor = mock(CatalogTableDescriptor.class);
+        CatalogIndexDescriptor indexDescriptor = mock(CatalogIndexDescriptor.class);
+        when(tableDescriptor.id()).thenReturn(1);
+        when(indexDescriptor.id()).thenReturn(1);
         when(catalogManager.createTable(any())).thenReturn(completedFuture(null));
+        when(catalogManager.createIndex(any(CreateHashIndexParams.class))).thenReturn(completedFuture(null));
+        when(catalogManager.createIndex(any(CreateSortedIndexParams.class))).thenReturn(completedFuture(null));
         when(catalogManager.dropTable(any())).thenReturn(completedFuture(null));
+        when(catalogManager.dropIndex(any())).thenReturn(completedFuture(null));
         when(catalogManager.table(anyString(), anyLong())).thenReturn(tableDescriptor);
-        when(tableDescriptor.id()).thenReturn(1);
+        when(catalogManager.index(anyString(), anyLong())).thenReturn(indexDescriptor);
 
         TableManager tableManager = new TableManager(
                 "test",


[ignite-3] 04/06: Get rid of DdlCommandHandlerWrapper. Get rid of unused methods. Fix styles.

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 38b512c5bd2213a3f08594ee77c178e762d7c8b3
Author: amashenkov <an...@gmail.com>
AuthorDate: Thu Jul 13 20:07:39 2023 +0300

    Get rid of DdlCommandHandlerWrapper.
    Get rid of unused methods.
    Fix styles.
---
 .../internal/catalog/CatalogServiceImpl.java       |   2 +-
 .../internal/catalog/commands/CatalogUtils.java    |   3 +
 .../distributionzones/DistributionZoneManager.java |   8 +-
 .../apache/ignite/internal/index/IndexManager.java | 176 ++-------
 .../ignite/internal/index/IndexManagerTest.java    |  11 +-
 .../ignite/internal/index/ItIndexManagerTest.java  |   8 +-
 .../testutils/SchemaToCatalogParamsConverter.java  |   3 +
 .../internal/sql/engine/SqlQueryProcessor.java     |   4 +-
 .../sql/engine/exec/ddl/DdlCommandHandler.java     | 403 ++-------------------
 .../engine/exec/ddl/DdlCommandHandlerWrapper.java  | 114 ------
 .../DdlCommandHandlerExceptionHandlingTest.java    |   2 +-
 .../ddl/DistributionZoneDdlCommandHandlerTest.java |   6 +-
 .../internal/table/distributed/TableManager.java   |  41 +--
 13 files changed, 86 insertions(+), 695 deletions(-)

diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
index cc6f54b1a0..e4a80697db 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
@@ -153,7 +153,7 @@ public class CatalogServiceImpl extends Producer<CatalogEvent, CatalogEventParam
 
         // TODO: IGNITE-19082 Move default schema objects initialization to cluster init procedure.
         CatalogSchemaDescriptor schemaPublic = new CatalogSchemaDescriptor(
-                0,
+                objectIdGen++,
                 DEFAULT_SCHEMA_NAME,
                 new CatalogTableDescriptor[0],
                 new CatalogIndexDescriptor[0]
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 7d53598e23..4243a54b3d 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
@@ -44,18 +44,21 @@ public class CatalogUtils {
      * <p>SQL`16 part 2 section 6.1 syntax rule 36
      */
     public static final int DEFAULT_TIMESTAMP_PRECISION = 6;
+
     /**
      * Default TIME type precision: seconds.
      *
      * <p>SQL`16 part 2 section 6.1 syntax rule 36
      */
     public static final int DEFAULT_TIME_PRECISION = 0;
+
     /**
      * Default DECIMAL precision is implementation-defined.
      *
      * <p>SQL`16 part 2 section 6.1 syntax rule 25
      */
     public static final int DEFAULT_DECIMAL_PRECISION = 19;
+
     /**
      * Default DECIMAL scale is implementation-defined.
      *
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
index 97863daf36..8f67682499 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
@@ -98,7 +98,6 @@ import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
 import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
 import org.apache.ignite.internal.catalog.commands.DropZoneParams;
 import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
-import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologyEventListener;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologyService;
@@ -409,12 +408,7 @@ public class DistributionZoneManager implements IgniteComponent {
                             .dataNodesAutoAdjustScaleDown(distributionZoneCfg.dataNodesAutoAdjustScaleDown())
                             .build())
                     .thenApply(ignore -> catalogManager.zone(distributionZoneCfg.name(), Long.MAX_VALUE))
-                    .thenCompose(zoneDescriptor -> createZone(zoneDescriptor.id(), distributionZoneCfg))
-                    .whenComplete((id, ex) -> {
-                        if (ex != null) {
-                            LOG.warn("Failed to create zone.", ex);
-                        }
-                    });
+                    .thenCompose(zoneDescriptor -> createZone(zoneDescriptor.id(), distributionZoneCfg));
         } finally {
             busyLock.leaveBusy();
         }
diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
index 2944ef3f6e..d14dc9dfd5 100644
--- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
+++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexManager.java
@@ -33,10 +33,10 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 import java.util.function.Function;
-import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.configuration.notifications.ConfigurationNamedListListener;
 import org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
 import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.commands.AbstractIndexCommandParams;
 import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
 import org.apache.ignite.internal.catalog.commands.DropIndexParams;
@@ -191,106 +191,52 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
     }
 
     /**
-     * Creates index from provided configuration changer.
-     *
-     * @param schemaName A name of the schema to create index in.
-     * @param indexName A name of the index to create.
-     * @param tableName A name of the table to create index for.
-     * @param failIfExists Flag indicates whether exception be thrown if index exists or not.
-     * @param indexChange A consumer that suppose to change the configuration in order to provide description of an index.
-     * @return A future represented the result of creation.
-     */
-    @Deprecated(forRemoval = true)
-    public CompletableFuture<Boolean> createIndexAsync(
-            String schemaName,
-            String indexName,
-            String tableName,
-            boolean failIfExists,
-            Consumer<TableIndexChange> indexChange
-    ) {
-        throw new UnsupportedOperationException("Method is no longer supported.");
-    }
-
-    /**
-     * Creates sorted index from provided parameters.
+     * Creates index from provided parameters.
      */
-    @Deprecated(forRemoval = true)
-    public CompletableFuture<Boolean> createSortedIndexAsync(CreateSortedIndexParams params) {
+    public CompletableFuture<Boolean> createIndexAsync(AbstractIndexCommandParams params) {
         if (!busyLock.enterBusy()) {
             return failedFuture(new NodeStoppingException());
         }
 
         try {
-            Consumer<TableIndexChange> indexChanger = tableIndexChange -> {
-                tableIndexChange.convert(SortedIndexChange.class).changeColumns(colsInit -> {
-                    for (int i = 0; i < params.columns().size(); i++) {
-                        String columnName = params.columns().get(i);
-                        CatalogColumnCollation collation = params.collations().get(i);
-                        //TODO: https://issues.apache.org/jira/browse/IGNITE-17563 Pass null ordering for columns.
-                        colsInit.create(columnName, colInit -> colInit.changeAsc(collation.asc()));
-                    }
-                });
-            };
-
-            return catalogManager.createIndex(params)
-                    .thenApply(ignore -> {
-                        CatalogIndexDescriptor index = catalogManager.index(params.indexName(), Long.MAX_VALUE);
-                        return index.id();
-                    })
-                    .thenCompose(indexId ->
-                            createIndexInternal(
-                                    indexId,
-                                    params.schemaName(),
-                                    params.indexName(),
-                                    params.tableName(),
-                                    true,
-                                    indexChanger
-                            )
-                    );
-        } catch (Exception ex) {
-            return failedFuture(ex);
+            CompletableFuture<Void> indexCreateFuture = (params instanceof CreateSortedIndexParams)
+                    ? catalogManager.createIndex((CreateSortedIndexParams) params)
+                    : catalogManager.createIndex((CreateHashIndexParams) params);
+
+            return indexCreateFuture.thenApply(ignore -> catalogManager.index(params.indexName(), Long.MAX_VALUE))
+                    .thenCompose(index -> createIndexInternal(
+                            index.id(),
+                            params.schemaName(),
+                            params.indexName(),
+                            params.tableName(),
+                            true,
+                            createIndexChanger(params)
+                    ));
         } finally {
             busyLock.leaveBusy();
         }
     }
 
-    /**
-     * Creates hash index from provided parameters.
-     */
     @Deprecated(forRemoval = true)
-    public CompletableFuture<Boolean> createHashIndexAsync(CreateHashIndexParams params) {
-        if (!busyLock.enterBusy()) {
-            return failedFuture(new NodeStoppingException());
-        }
-
-        try {
-            Consumer<TableIndexChange> indexChanger = tableIndexChange -> {
-                tableIndexChange.convert(HashIndexChange.class)
-                        .changeColumnNames(params.columns().toArray(STRING_EMPTY_ARRAY));
-            };
-
-            return catalogManager.createIndex(params)
-                    .thenApply(ignore -> {
-                        CatalogIndexDescriptor index = catalogManager.index(params.indexName(), Long.MAX_VALUE);
-                        return index.id();
-                    })
-                    .thenCompose(indexId ->
-                            createIndexInternal(
-                                    indexId,
-                                    params.schemaName(),
-                                    params.indexName(),
-                                    params.tableName(),
-                                    true,
-                                    indexChanger
-                            )
-                    );
-        } catch (Exception ex) {
-            return failedFuture(ex);
-        } finally {
-            busyLock.leaveBusy();
+    private Consumer<TableIndexChange> createIndexChanger(AbstractIndexCommandParams indexParams) {
+        if (indexParams instanceof CreateSortedIndexParams) {
+            CreateSortedIndexParams params = (CreateSortedIndexParams) indexParams;
+            return tableIndexChange -> tableIndexChange.convert(SortedIndexChange.class).changeColumns(colsInit -> {
+                for (int i = 0; i < params.columns().size(); i++) {
+                    String columnName = params.columns().get(i);
+                    CatalogColumnCollation collation = params.collations().get(i);
+                    //TODO: https://issues.apache.org/jira/browse/IGNITE-17563 Pass null ordering for columns.
+                    colsInit.create(columnName, colInit -> colInit.changeAsc(collation.asc()));
+                }
+            });
+        } else {
+            CreateHashIndexParams params = (CreateHashIndexParams) indexParams;
+            return tableIndexChange -> tableIndexChange.convert(HashIndexChange.class)
+                    .changeColumnNames(params.columns().toArray(STRING_EMPTY_ARRAY));
         }
     }
 
+    @Deprecated(forRemoval = true)
     private CompletableFuture<Boolean> createIndexInternal(
             int indexId,
             String schemaName,
@@ -366,29 +312,11 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
             });
 
             return future;
-        } catch (Exception ex) {
-            return failedFuture(ex);
         } finally {
             busyLock.leaveBusy();
         }
     }
 
-    /**
-     * Drops the index with a given name asynchronously.
-     *
-     * @param schemaName A name of the schema the index belong to.
-     * @param indexName A name of the index to drop.
-     * @param failIfNotExists Flag, which force failure, when {@code trues} if index doen't not exists.
-     * @return A future representing the result of the operation.
-     */
-    public CompletableFuture<Boolean> dropIndexAsync(
-            String schemaName,
-            String indexName,
-            boolean failIfNotExists
-    ) {
-        throw new UnsupportedOperationException("Method is no longer supported.");
-    }
-
     /**
      * Drops the index with a given parameters asynchronously.
      */
@@ -397,17 +325,14 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
             throw new IgniteException(new NodeStoppingException());
         }
         try {
-            CompletableFuture<Boolean> future = catalogManager.dropIndex(params)
+            return catalogManager.dropIndex(params)
                     .thenCompose(ignore -> dropIndexAsyncInternal(params.schemaName(), params.indexName(), true));
-
-            future.whenComplete((res, ex) -> ex.printStackTrace());
-
-            return future;
         } finally {
             busyLock.leaveBusy();
         }
     }
 
+    @Deprecated(forRemoval = true)
     private CompletableFuture<Boolean> dropIndexAsyncInternal(
             String schemaName,
             String indexName,
@@ -456,44 +381,11 @@ public class IndexManager extends Producer<IndexEvent, IndexEventParameters> imp
             });
 
             return future;
-        } catch (Exception ex) {
-            return failedFuture(ex);
         } finally {
             busyLock.leaveBusy();
         }
     }
 
-    /**
-     * Gets a list of index configuration views for the specified table.
-     *
-     * @param tableName Table name.
-     * @return List of index configuration views.
-     */
-    public List<TableIndexView> indexConfigurations(String tableName) {
-        List<TableIndexView> res = new ArrayList<>();
-        Integer targetTableId = null;
-
-        NamedListView<TableView> tablesView = tablesCfg.tables().value();
-
-        for (TableIndexView cfg : tablesCfg.indexes().value()) {
-            if (targetTableId == null) {
-                TableView tbl = findTableView(tablesView, cfg.tableId());
-
-                if (tbl == null || !tableName.equals(tbl.name())) {
-                    continue;
-                }
-
-                targetTableId = cfg.tableId();
-            } else if (!targetTableId.equals(cfg.tableId())) {
-                continue;
-            }
-
-            res.add(cfg);
-        }
-
-        return res;
-    }
-
     private void validateName(String indexName) {
         if (StringUtils.nullOrEmpty(indexName)) {
             throw new IgniteInternalException(
diff --git a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
index 40fb2c13f7..53b2abf6d2 100644
--- a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
+++ b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
@@ -141,14 +141,15 @@ public class IndexManagerTest {
     void configurationChangedWhenCreateIsInvoked() {
         String indexName = "idx";
 
-        assertThat(indexManager.createSortedIndexAsync(
+        assertThat(indexManager.createIndexAsync(
                 CreateSortedIndexParams.builder()
                         .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
                         .tableName("tName")
                         .indexName(indexName)
                         .columns(List.of("c1", "c2"))
                         .collations(List.of(CatalogColumnCollation.ASC_NULLS_LAST, CatalogColumnCollation.DESC_NULLS_FIRST))
-                        .build()), willCompleteSuccessfully());
+                        .build()),
+                willCompleteSuccessfully());
 
         var expected = List.of(
                 Map.of(
@@ -176,7 +177,7 @@ public class IndexManagerTest {
     @Test
     public void createIndexWithEmptyName() {
         assertThat(
-                indexManager.createHashIndexAsync(
+                indexManager.createIndexAsync(
                         CreateHashIndexParams.builder()
                                 .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
                                 .tableName("tName")
@@ -187,7 +188,7 @@ public class IndexManagerTest {
         );
 
         assertThat(
-                indexManager.createSortedIndexAsync(
+                indexManager.createIndexAsync(
                         CreateSortedIndexParams.builder()
                                 .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
                                 .tableName("tName")
@@ -229,7 +230,7 @@ public class IndexManagerTest {
             return completedFuture(true);
         });
 
-        assertThat(indexManager.createSortedIndexAsync(
+        assertThat(indexManager.createIndexAsync(
                         CreateSortedIndexParams.builder()
                                 .schemaName(CatalogManager.DEFAULT_SCHEMA_NAME)
                                 .indexName(indexName)
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
index 3c7eca2188..242c4fbdca 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/index/ItIndexManagerTest.java
@@ -70,7 +70,7 @@ public class ItIndexManagerTest extends ClusterPerClassIntegrationTest {
 
         CompletableFuture<IndexEventParameters> indexCreatedFuture = registerListener(indexManager, IndexEvent.CREATE);
 
-        await(indexManager.createHashIndexAsync(
+        await(indexManager.createIndexAsync(
                 CreateHashIndexParams.builder()
                         .schemaName("PUBLIC")
                         .indexName("INAME")
@@ -93,11 +93,7 @@ public class ItIndexManagerTest extends ClusterPerClassIntegrationTest {
 
         CompletableFuture<IndexEventParameters> indexDroppedFuture = registerListener(indexManager, IndexEvent.DROP);
 
-        await(indexManager.dropIndexAsync(
-                DropIndexParams.builder()
-                        .schemaName("PUBLIC")
-                        .indexName("INAME")
-                        .build()));
+        await(indexManager.dropIndexAsync(DropIndexParams.builder().schemaName("PUBLIC").indexName("INAME").build()));
 
         {
             IndexEventParameters params = await(indexDroppedFuture);
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaToCatalogParamsConverter.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaToCatalogParamsConverter.java
index a00eda8c7f..8c5aff76fd 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaToCatalogParamsConverter.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaToCatalogParamsConverter.java
@@ -39,6 +39,7 @@ public class SchemaToCatalogParamsConverter {
      * Types map.
      */
     private static final EnumSet<ColumnType.ColumnTypeSpec> fixSizedTypes = EnumSet.of(
+            ColumnType.BOOLEAN.typeSpec(),
             ColumnType.INT8.typeSpec(),
             ColumnType.INT16.typeSpec(),
             ColumnType.INT32.typeSpec(),
@@ -116,6 +117,8 @@ public class SchemaToCatalogParamsConverter {
 
     private static org.apache.ignite.sql.ColumnType convert(ColumnType colType) {
         switch (colType.typeSpec()) {
+            case BOOLEAN:
+                return org.apache.ignite.sql.ColumnType.BOOLEAN;
             case INT8:
                 return org.apache.ignite.sql.ColumnType.INT8;
             case INT16:
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
index f67294f396..a0b5c9bc24 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
@@ -62,7 +62,7 @@ import org.apache.ignite.internal.sql.engine.exec.MailboxRegistryImpl;
 import org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutor;
 import org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl;
 import org.apache.ignite.internal.sql.engine.exec.QueryValidationException;
-import org.apache.ignite.internal.sql.engine.exec.ddl.DdlCommandHandlerWrapper;
+import org.apache.ignite.internal.sql.engine.exec.ddl.DdlCommandHandler;
 import org.apache.ignite.internal.sql.engine.message.MessageServiceImpl;
 import org.apache.ignite.internal.sql.engine.prepare.PrepareService;
 import org.apache.ignite.internal.sql.engine.prepare.PrepareServiceImpl;
@@ -249,7 +249,7 @@ public class SqlQueryProcessor implements QueryProcessor {
 
         this.prepareSvc = prepareSvc;
 
-        var ddlCommandHandler = new DdlCommandHandlerWrapper(
+        var ddlCommandHandler = new DdlCommandHandler(
                 distributionZoneManager,
                 tableManager,
                 indexManager,
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
index 5760dc2a85..e8ec21d5eb 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
@@ -19,97 +19,52 @@ package org.apache.ignite.internal.sql.engine.exec.ddl;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
-import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_NAME;
-import static org.apache.ignite.internal.sql.engine.SqlQueryProcessor.DEFAULT_SCHEMA_NAME;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
+import static org.apache.ignite.lang.ErrorGroups.Sql.UNSUPPORTED_DDL_OPERATION_ERR;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-import org.apache.ignite.configuration.NamedListView;
+import org.apache.ignite.internal.catalog.CatalogManager;
 import org.apache.ignite.internal.distributionzones.DistributionZoneConfigurationParameters;
 import org.apache.ignite.internal.distributionzones.DistributionZoneManager;
 import org.apache.ignite.internal.index.IndexManager;
-import org.apache.ignite.internal.schema.BitmaskNativeType;
-import org.apache.ignite.internal.schema.DecimalNativeType;
-import org.apache.ignite.internal.schema.NativeType;
-import org.apache.ignite.internal.schema.NativeTypeSpec;
-import org.apache.ignite.internal.schema.NumberNativeType;
-import org.apache.ignite.internal.schema.TemporalNativeType;
-import org.apache.ignite.internal.schema.VarlenNativeType;
-import org.apache.ignite.internal.schema.configuration.ColumnChange;
-import org.apache.ignite.internal.schema.configuration.ColumnTypeChange;
-import org.apache.ignite.internal.schema.configuration.ColumnView;
-import org.apache.ignite.internal.schema.configuration.PrimaryKeyView;
-import org.apache.ignite.internal.schema.configuration.TableChange;
-import org.apache.ignite.internal.schema.configuration.ValueSerializationHelper;
-import org.apache.ignite.internal.schema.configuration.defaultvalue.ConstantValueDefaultChange;
-import org.apache.ignite.internal.schema.configuration.defaultvalue.FunctionCallDefaultChange;
-import org.apache.ignite.internal.schema.configuration.defaultvalue.NullValueDefaultChange;
-import org.apache.ignite.internal.schema.configuration.index.HashIndexChange;
-import org.apache.ignite.internal.schema.configuration.index.HashIndexView;
-import org.apache.ignite.internal.schema.configuration.index.IndexColumnView;
-import org.apache.ignite.internal.schema.configuration.index.SortedIndexChange;
-import org.apache.ignite.internal.schema.configuration.index.SortedIndexView;
-import org.apache.ignite.internal.schema.configuration.index.TableIndexChange;
-import org.apache.ignite.internal.schema.configuration.index.TableIndexView;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AbstractTableDdlCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterColumnCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableAddCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableDropCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneRenameCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneSetCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.ColumnDefinition;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateTableCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateZoneCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DdlCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.DefaultValueDefinition.ConstantValue;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.DefaultValueDefinition.FunctionCall;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DropIndexCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DropTableCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DropZoneCommand;
-import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Collation;
-import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.table.distributed.TableManager;
-import org.apache.ignite.internal.util.ArrayUtils;
 import org.apache.ignite.internal.util.StringUtils;
-import org.apache.ignite.lang.ColumnAlreadyExistsException;
-import org.apache.ignite.lang.ColumnNotFoundException;
 import org.apache.ignite.lang.DistributionZoneAlreadyExistsException;
 import org.apache.ignite.lang.DistributionZoneNotFoundException;
-import org.apache.ignite.lang.ErrorGroups;
-import org.apache.ignite.lang.ErrorGroups.Table;
-import org.apache.ignite.lang.IgniteStringBuilder;
-import org.apache.ignite.lang.IgniteStringFormatter;
+import org.apache.ignite.lang.IndexAlreadyExistsException;
+import org.apache.ignite.lang.IndexNotFoundException;
 import org.apache.ignite.lang.TableAlreadyExistsException;
 import org.apache.ignite.lang.TableNotFoundException;
-import org.apache.ignite.sql.SqlException;
 
 /** DDL commands handler. */
 public class DdlCommandHandler {
     private final DistributionZoneManager distributionZoneManager;
 
-    protected final TableManager tableManager;
+    private final TableManager tableManager;
 
-    protected final IndexManager indexManager;
+    private final IndexManager indexManager;
 
     private final DataStorageManager dataStorageManager;
 
+    private final CatalogManager catalogManager;
+
     /**
      * Constructor.
      */
@@ -117,12 +72,14 @@ public class DdlCommandHandler {
             DistributionZoneManager distributionZoneManager,
             TableManager tableManager,
             IndexManager indexManager,
-            DataStorageManager dataStorageManager
+            DataStorageManager dataStorageManager,
+            CatalogManager catalogManager
     ) {
         this.distributionZoneManager = distributionZoneManager;
         this.tableManager = tableManager;
         this.indexManager = indexManager;
         this.dataStorageManager = dataStorageManager;
+        this.catalogManager = catalogManager;
     }
 
     /** Handles ddl commands. */
@@ -138,7 +95,7 @@ public class DdlCommandHandler {
         } else if (cmd instanceof AlterTableDropCommand) {
             return handleAlterDropColumn((AlterTableDropCommand) cmd);
         } else if (cmd instanceof AlterColumnCommand) {
-            return completedFuture(true);
+            return handleAlterColumn((AlterColumnCommand) cmd);
         } else if (cmd instanceof CreateIndexCommand) {
             return handleCreateIndex((CreateIndexCommand) cmd);
         } else if (cmd instanceof DropIndexCommand) {
@@ -258,51 +215,13 @@ public class DdlCommandHandler {
 
     /** Handles create table command. */
     private CompletableFuture<Boolean> handleCreateTable(CreateTableCommand cmd) {
-        cmd.columns().stream()
-                .map(ColumnDefinition::name)
-                .filter(Predicate.not(new HashSet<>()::add))
-                .findAny()
-                .ifPresent(col -> {
-                    throw new SqlException(Table.TABLE_DEFINITION_ERR, "Can't create table with duplicate columns: "
-                            + cmd.columns().stream().map(ColumnDefinition::name).collect(Collectors.joining(", ")));
-                });
-
-        Consumer<TableChange> tblChanger = tableChange -> {
-            tableChange.changeColumns(columnsChange -> {
-                for (var col : cmd.columns()) {
-                    columnsChange.create(col.name(), columnChange -> convertColumnDefinition(col, columnChange));
-                }
-            });
-
-            var colocationKeys = cmd.colocationColumns();
-
-            if (nullOrEmpty(colocationKeys)) {
-                colocationKeys = cmd.primaryKeyColumns();
-            }
-
-            var colocationKeys0 = colocationKeys;
-
-            tableChange.changePrimaryKey(pkChange -> pkChange.changeColumns(cmd.primaryKeyColumns().toArray(String[]::new))
-                    .changeColocationColumns(colocationKeys0.toArray(String[]::new)));
-        };
-
-        String zoneName;
-
-        if (cmd.zone() != null) {
-            zoneName = cmd.zone();
-        } else {
-            zoneName = DEFAULT_ZONE_NAME;
-        }
-
-        return tableManager.createTableAsync(cmd.tableName(), zoneName, tblChanger)
-                .thenApply(Objects::nonNull)
+        return tableManager.createTableAsync(DdlToCatalogCommandConverter.convert(cmd))
                 .handle(handleModificationResult(cmd.ifTableExists(), TableAlreadyExistsException.class));
     }
 
     /** Handles drop table command. */
     private CompletableFuture<Boolean> handleDropTable(DropTableCommand cmd) {
-        return tableManager.dropTableAsync(cmd.tableName())
-                .thenApply(v -> Boolean.TRUE)
+        return tableManager.dropTableAsync(DdlToCatalogCommandConverter.convert(cmd))
                 .handle(handleModificationResult(cmd.ifTableExists(), TableNotFoundException.class));
     }
 
@@ -312,7 +231,7 @@ public class DdlCommandHandler {
             return completedFuture(Boolean.FALSE);
         }
 
-        return addColumnInternal(cmd.tableName(), cmd.columns())
+        return tableManager.alterTableAddColumnAsync(DdlToCatalogCommandConverter.convert(cmd))
                 .handle(handleModificationResult(cmd.ifTableExists(), TableNotFoundException.class));
     }
 
@@ -322,11 +241,17 @@ public class DdlCommandHandler {
             return completedFuture(Boolean.FALSE);
         }
 
-        return dropColumnInternal(cmd.tableName(), cmd.columns())
+        return tableManager.alterTableDropColumnAsync(DdlToCatalogCommandConverter.convert(cmd))
                 .handle(handleModificationResult(cmd.ifTableExists(), TableNotFoundException.class));
     }
 
-    protected static BiFunction<Object, Throwable, Boolean> handleModificationResult(boolean ignoreExpectedError, Class<?> expErrCls) {
+    /** Handles alter column command. */
+    private CompletableFuture<Boolean> handleAlterColumn(AlterColumnCommand cmd) {
+        return catalogManager.alterColumn(DdlToCatalogCommandConverter.convert(cmd))
+                .handle(handleModificationResult(cmd.ifTableExists(), TableNotFoundException.class));
+    }
+
+    private static BiFunction<Object, Throwable, Boolean> handleModificationResult(boolean ignoreExpectedError, Class<?> expErrCls) {
         return (val, err) -> {
             if (err == null) {
                 return val instanceof Boolean ? (Boolean) val : Boolean.TRUE;
@@ -344,287 +269,13 @@ public class DdlCommandHandler {
 
     /** Handles create index command. */
     private CompletableFuture<Boolean> handleCreateIndex(CreateIndexCommand cmd) {
-        cmd.columns().stream()
-                .filter(Predicate.not(new HashSet<>()::add))
-                .findAny()
-                .ifPresent(col -> {
-                    throw new SqlException(ErrorGroups.Index.INVALID_INDEX_DEFINITION_ERR,
-                            "Can't create index on duplicate columns: " + String.join(", ", cmd.columns()));
-                });
-
-        Consumer<TableIndexChange> indexChanger = tableIndexChange -> {
-            switch (cmd.type()) {
-                case SORTED:
-                    createSortedIndexInternal(cmd, tableIndexChange.convert(SortedIndexChange.class));
-
-                    break;
-                case HASH:
-                    createHashIndexInternal(cmd, tableIndexChange.convert(HashIndexChange.class));
-
-                    break;
-                default:
-                    throw new AssertionError("Unknown index type [type=" + cmd.type() + "]");
-            }
-        };
-
-        return indexManager.createIndexAsync(
-                cmd.schemaName(),
-                cmd.indexName(),
-                cmd.tableName(),
-                !cmd.ifNotExists(),
-                indexChanger);
+        return indexManager.createIndexAsync(DdlToCatalogCommandConverter.convert(cmd))
+                .handle(handleModificationResult(cmd.ifNotExists(), IndexAlreadyExistsException.class));
     }
 
     /** Handles drop index command. */
     private CompletableFuture<Boolean> handleDropIndex(DropIndexCommand cmd) {
-        return indexManager.dropIndexAsync(cmd.schemaName(), cmd.indexName(), !cmd.ifNotExists());
-    }
-
-    /**
-     * Creates sorted index.
-     *
-     * @param cmd Create index command.
-     * @param indexChange Index configuration changer.
-     */
-    private void createSortedIndexInternal(CreateIndexCommand cmd, SortedIndexChange indexChange) {
-        indexChange.changeColumns(colsInit -> {
-            for (int i = 0; i < cmd.columns().size(); i++) {
-                String columnName = cmd.columns().get(i);
-                Collation collation = cmd.collations().get(i);
-                //TODO: https://issues.apache.org/jira/browse/IGNITE-17563 Pass null ordering for columns.
-                colsInit.create(columnName, colInit -> colInit.changeAsc(collation.asc));
-            }
-        });
-    }
-
-    /**
-     * Creates hash index.
-     *
-     * @param cmd Create index command.
-     * @param indexChange Index configuration changer.
-     */
-    private void createHashIndexInternal(CreateIndexCommand cmd, HashIndexChange indexChange) {
-        indexChange.changeColumnNames(cmd.columns().toArray(ArrayUtils.STRING_EMPTY_ARRAY));
-    }
-
-    /**
-     * Adds a column according to the column definition.
-     *
-     * @param fullName Table with schema name.
-     * @param colsDef Columns defenitions.
-     * @return {@code true} if the full columns set is applied successfully. Otherwise, returns {@code false}.
-     */
-    private CompletableFuture<Boolean> addColumnInternal(String fullName, List<ColumnDefinition> colsDef) {
-        AtomicBoolean retUsr = new AtomicBoolean(true);
-
-        return tableManager.alterTableAsync(
-                fullName,
-                chng -> {
-                    AtomicBoolean retTbl = new AtomicBoolean();
-
-                    chng.changeColumns(cols -> {
-                        retUsr.set(true); // Reset state if closure have been restarted.
-
-                        Set<String> colNamesToOrders = columnNames(chng.columns());
-
-                        colsDef.stream()
-                                .filter(k -> colNamesToOrders.contains(k.name()))
-                                .findAny()
-                                .ifPresent(c -> {
-                                    throw new ColumnAlreadyExistsException(c.name());
-                                });
-
-                        for (ColumnDefinition col : colsDef) {
-                            cols.create(col.name(), colChg -> convertColumnDefinition(col, colChg));
-                        }
-
-                        retTbl.set(!colsDef.isEmpty());
-                    });
-
-                    return retTbl.get();
-                }
-        ).thenApply(v -> retUsr.get());
-    }
-
-    private void convertColumnDefinition(ColumnDefinition definition, ColumnChange columnChange) {
-        NativeType columnType = IgniteTypeFactory.relDataTypeToNative(definition.type());
-
-        columnChange.changeType(columnTypeChange -> convert(columnType, columnTypeChange));
-        columnChange.changeNullable(definition.nullable());
-        columnChange.changeDefaultValueProvider(defaultChange -> {
-            switch (definition.defaultValueDefinition().type()) {
-                case CONSTANT:
-                    ConstantValue constantValue = definition.defaultValueDefinition();
-
-                    var val = constantValue.value();
-
-                    if (val != null) {
-                        defaultChange.convert(ConstantValueDefaultChange.class)
-                                .changeDefaultValue(ValueSerializationHelper.toString(val, columnType));
-                    } else {
-                        defaultChange.convert(NullValueDefaultChange.class);
-                    }
-
-                    break;
-                case FUNCTION_CALL:
-                    FunctionCall functionCall = definition.defaultValueDefinition();
-
-                    defaultChange.convert(FunctionCallDefaultChange.class)
-                            .changeFunctionName(functionCall.functionName());
-
-                    break;
-                default:
-                    throw new IllegalStateException("Unknown default value definition type [type="
-                            + definition.defaultValueDefinition().type() + ']');
-            }
-        });
-    }
-
-    /**
-     * Drops a column(s) exceptional behavior depends on {@code colExist} flag.
-     *
-     * @param tableName Table name.
-     * @param colNames Columns definitions.
-     * @return {@code true} if the full columns set is applied successfully. Otherwise, returns {@code false}.
-     */
-    private CompletableFuture<Boolean> dropColumnInternal(String tableName, Set<String> colNames) {
-        AtomicBoolean ret = new AtomicBoolean(true);
-
-        return tableManager.alterTableAsync(
-                tableName,
-                chng -> {
-                    chng.changeColumns(cols -> {
-                        ret.set(true); // Reset state if closure have been restarted.
-
-                        PrimaryKeyView priKey = chng.primaryKey();
-
-                        Set<String> colNamesToOrders = columnNames(chng.columns());
-
-                        Set<String> colNames0 = new HashSet<>();
-
-                        Set<String> primaryCols = Set.of(priKey.columns());
-
-                        reportIndexedColumns(tableName, colNames, primaryCols);
-
-                        for (String colName : colNames) {
-                            if (!colNamesToOrders.contains(colName)) {
-                                ret.set(false);
-
-                                throw new ColumnNotFoundException(DEFAULT_SCHEMA_NAME, tableName, colName);
-                            } else {
-                                colNames0.add(colName);
-                            }
-
-                            if (primaryCols.contains(colName)) {
-                                throw new SqlException(STMT_VALIDATION_ERR, IgniteStringFormatter
-                                        .format("Can`t delete column, belongs to primary key: [name={}]", colName));
-                            }
-                        }
-
-                        colNames0.forEach(cols::delete);
-                    });
-
-                    return ret.get();
-                }).thenApply(v -> ret.get());
-    }
-
-    private void reportIndexedColumns(String tableName, Set<String> colNames, Set<String> pkColNames) throws SqlException {
-        Map<String, List<String>> indexedColumns = new HashMap<>();
-
-        for (TableIndexView idxCfg : indexManager.indexConfigurations(tableName)) {
-            if (idxCfg instanceof SortedIndexView) {
-                for (IndexColumnView colView : ((SortedIndexView) idxCfg).columns()) {
-                    if (colNames.contains(colView.name()) && !pkColNames.contains(colView.name())) {
-                        indexedColumns.computeIfAbsent(colView.name(), v -> new ArrayList<>()).add(idxCfg.name());
-                    }
-                }
-            } else if (idxCfg instanceof HashIndexView) {
-                for (String colName : ((HashIndexView) idxCfg).columnNames()) {
-                    if (colNames.contains(colName) && !pkColNames.contains(colName)) {
-                        indexedColumns.computeIfAbsent(colName, v -> new ArrayList<>()).add(idxCfg.name());
-                    }
-                }
-            }
-        }
-
-        if (indexedColumns.isEmpty()) {
-            return;
-        }
-
-        IgniteStringBuilder sb = new IgniteStringBuilder("Can`t delete column(s). ");
-
-        for (Entry<String, List<String>> e : indexedColumns.entrySet()) {
-            sb.app("Column ").app(e.getKey()).app(" is used by indexes ").app(e.getValue()).app(". ");
-        }
-
-        throw new SqlException(STMT_VALIDATION_ERR, sb.toString());
-    }
-
-    private static void convert(NativeType colType, ColumnTypeChange colTypeChg) {
-        NativeTypeSpec spec = colType.spec();
-        String typeName = spec.name().toUpperCase();
-
-        colTypeChg.changeType(typeName);
-
-        switch (spec) {
-            case BOOLEAN:
-            case INT8:
-            case INT16:
-            case INT32:
-            case INT64:
-            case FLOAT:
-            case DOUBLE:
-            case DATE:
-            case UUID:
-                // do nothing
-                break;
-
-            case BITMASK:
-                BitmaskNativeType bitmaskColType = (BitmaskNativeType) colType;
-
-                colTypeChg.changeLength(bitmaskColType.bits());
-
-                break;
-
-            case BYTES:
-            case STRING:
-                VarlenNativeType varLenColType = (VarlenNativeType) colType;
-
-                colTypeChg.changeLength(varLenColType.length());
-
-                break;
-
-            case DECIMAL:
-                DecimalNativeType numColType = (DecimalNativeType) colType;
-
-                colTypeChg.changePrecision(numColType.precision());
-                colTypeChg.changeScale(numColType.scale());
-
-                break;
-
-            case NUMBER:
-                NumberNativeType numType = (NumberNativeType) colType;
-
-                colTypeChg.changePrecision(numType.precision());
-
-                break;
-
-            case TIME:
-            case DATETIME:
-            case TIMESTAMP:
-                TemporalNativeType temporalColType = (TemporalNativeType) colType;
-
-                colTypeChg.changePrecision(temporalColType.precision());
-
-                break;
-
-            default:
-                throw new IllegalArgumentException("Unknown type " + colType.spec().name());
-        }
-    }
-
-    /** Column names set. */
-    private static Set<String> columnNames(NamedListView<? extends ColumnView> cols) {
-        return new HashSet<>(cols.namedListKeys());
+        return indexManager.dropIndexAsync(DdlToCatalogCommandConverter.convert(cmd))
+                .handle(handleModificationResult(cmd.ifNotExists(), IndexNotFoundException.class));
     }
 }
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
deleted file mode 100644
index 7fbd884f9b..0000000000
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.sql.engine.exec.ddl;
-
-import static java.util.concurrent.CompletableFuture.failedFuture;
-import static org.apache.ignite.lang.ErrorGroups.Sql.UNSUPPORTED_DDL_OPERATION_ERR;
-
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import org.apache.ignite.internal.catalog.CatalogManager;
-import org.apache.ignite.internal.catalog.commands.AbstractIndexCommandParams;
-import org.apache.ignite.internal.catalog.commands.CreateHashIndexParams;
-import org.apache.ignite.internal.catalog.commands.CreateSortedIndexParams;
-import org.apache.ignite.internal.distributionzones.DistributionZoneManager;
-import org.apache.ignite.internal.index.IndexManager;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterColumnCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableAddCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableDropCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateTableCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.DdlCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.DropIndexCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.DropTableCommand;
-import org.apache.ignite.internal.storage.DataStorageManager;
-import org.apache.ignite.internal.table.distributed.TableManager;
-import org.apache.ignite.lang.IgniteInternalCheckedException;
-import org.apache.ignite.lang.IndexAlreadyExistsException;
-import org.apache.ignite.lang.IndexNotFoundException;
-import org.apache.ignite.lang.TableAlreadyExistsException;
-import org.apache.ignite.lang.TableNotFoundException;
-
-/**
- * Wrapper for DDL command handler passes DDL commands to CatalogService.
- * TODO: IGNITE-19082 Drop this wrapper when all the versioned schema stuff will be moved from Configuration to Catalog.
- */
-public class DdlCommandHandlerWrapper extends DdlCommandHandler {
-
-    private final CatalogManager catalogManager;
-
-    /**
-     * Constructor.
-     */
-    public DdlCommandHandlerWrapper(
-            DistributionZoneManager distributionZoneManager,
-            TableManager tableManager,
-            IndexManager indexManager,
-            DataStorageManager dataStorageManager,
-            CatalogManager catalogManager
-    ) {
-        super(distributionZoneManager, tableManager, indexManager, dataStorageManager);
-
-        this.catalogManager = Objects.requireNonNull(catalogManager, "Catalog service");
-    }
-
-    /** Handles ddl commands. */
-    @Override
-    public CompletableFuture<Boolean> handle(DdlCommand cmd) {
-        // TODO IGNITE-19082 replace TableManager with CatalogManager calls.
-        if (cmd instanceof CreateTableCommand) {
-            return tableManager.createTableAsync(DdlToCatalogCommandConverter.convert((CreateTableCommand) cmd))
-                    .handle(handleModificationResult(((CreateTableCommand) cmd).ifTableExists(), TableAlreadyExistsException.class));
-        } else if (cmd instanceof DropTableCommand) {
-            return tableManager.dropTableAsync(DdlToCatalogCommandConverter.convert((DropTableCommand) cmd))
-                    .handle(handleModificationResult(((DropTableCommand) cmd).ifTableExists(), TableNotFoundException.class));
-        } else if (cmd instanceof AlterTableAddCommand) {
-            AlterTableAddCommand addCommand = (AlterTableAddCommand) cmd;
-
-            return tableManager.alterTableAddColumnAsync(DdlToCatalogCommandConverter.convert(addCommand))
-                    .handle(handleModificationResult(addCommand.ifTableExists(), TableNotFoundException.class));
-        } else if (cmd instanceof AlterTableDropCommand) {
-            AlterTableDropCommand dropCommand = (AlterTableDropCommand) cmd;
-
-            return tableManager.alterTableDropColumnAsync(DdlToCatalogCommandConverter.convert(dropCommand))
-                    .handle(handleModificationResult(dropCommand.ifTableExists(), TableNotFoundException.class));
-        } else if (cmd instanceof AlterColumnCommand) {
-            return catalogManager.alterColumn(DdlToCatalogCommandConverter.convert((AlterColumnCommand) cmd))
-                    .handle(handleModificationResult(((AlterColumnCommand) cmd).ifTableExists(), TableNotFoundException.class));
-        } else if (cmd instanceof CreateIndexCommand) {
-            AbstractIndexCommandParams params = DdlToCatalogCommandConverter.convert((CreateIndexCommand) cmd);
-
-            if (params instanceof CreateSortedIndexParams) {
-                return indexManager.createSortedIndexAsync((CreateSortedIndexParams) params)
-                        .handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class));
-            } else if (params instanceof CreateHashIndexParams) {
-                return indexManager.createHashIndexAsync((CreateHashIndexParams) params)
-                        .handle(handleModificationResult(((CreateIndexCommand) cmd).ifNotExists(), IndexAlreadyExistsException.class));
-            }
-
-            return failedFuture(new IgniteInternalCheckedException(UNSUPPORTED_DDL_OPERATION_ERR, "Unsupported DDL operation ["
-                    + "cmdName=" + cmd.getClass().getSimpleName() + "]"));
-        } else if (cmd instanceof DropIndexCommand) {
-            return indexManager.dropIndexAsync(DdlToCatalogCommandConverter.convert((DropIndexCommand) cmd))
-                    .handle(handleModificationResult(((DropIndexCommand) cmd).ifNotExists(), IndexNotFoundException.class));
-        }
-
-        // Handle other commands in usual way.
-        return super.handle(cmd);
-    }
-}
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
index b9e810ecd0..26bf4c8f28 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
@@ -125,7 +125,7 @@ public class DdlCommandHandlerExceptionHandlingTest extends IgniteAbstractTest {
                 "node"
         );
 
-        commandHandler = new DdlCommandHandler(distributionZoneManager, tableManager, indexManager, dataStorageManager);
+        commandHandler = new DdlCommandHandler(distributionZoneManager, tableManager, indexManager, dataStorageManager, catalogManager);
     }
 
     @AfterEach
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java
index 8b52467311..d0a057b241 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import java.util.Arrays;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicReference;
+import org.apache.ignite.internal.catalog.CatalogManager;
 import org.apache.ignite.internal.distributionzones.DistributionZoneConfigurationParameters;
 import org.apache.ignite.internal.distributionzones.DistributionZoneManager;
 import org.apache.ignite.internal.index.IndexManager;
@@ -65,6 +66,9 @@ public class DistributionZoneDdlCommandHandlerTest extends IgniteAbstractTest {
     @Mock
     private DataStorageManager dataStorageManager;
 
+    @Mock
+    private CatalogManager catalogManager;
+
     /** DDL commands handler. */
     private DdlCommandHandler commandHandler;
 
@@ -79,7 +83,7 @@ public class DistributionZoneDdlCommandHandlerTest extends IgniteAbstractTest {
                     return CompletableFuture.completedFuture(null);
                 });
 
-        commandHandler = new DdlCommandHandler(distributionZoneManager, tableManager, indexManager, dataStorageManager);
+        commandHandler = new DdlCommandHandler(distributionZoneManager, tableManager, indexManager, dataStorageManager, catalogManager);
     }
 
 
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index 7ed2bb896f..2da7a08ef3 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -1480,25 +1480,6 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
         );
     }
 
-    /**
-     * Creates a new table with the given {@code name} asynchronously. If a table with the same name already exists, a future will be
-     * completed with {@link TableAlreadyExistsException}.
-     *
-     * @param name Table name.
-     * @param zoneName Distribution zone name.
-     * @param tableInitChange Table changer.
-     * @return Future representing pending completion of the operation.
-     * @throws IgniteException If an unspecified platform exception has happened internally. Is thrown when:
-     *         <ul>
-     *             <li>the node is stopping.</li>
-     *         </ul>
-     * @see TableAlreadyExistsException
-     */
-    @Deprecated
-    public CompletableFuture<Table> createTableAsync(String name, String zoneName, Consumer<TableChange> tableInitChange) {
-        throw new UnsupportedOperationException("Method is no longer supported.");
-    }
-
     /**
      * Creates a new table from parameters.
      *
@@ -1506,7 +1487,6 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      * @return Future representing pending completion of the operation.
      * @see TableAlreadyExistsException
      */
-    @Deprecated(forRemoval = true)
     public CompletableFuture<Table> createTableAsync(CreateTableParams parameters) {
         if (!busyLock.enterBusy()) {
             throw new IgniteException(new NodeStoppingException());
@@ -1715,7 +1695,6 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      * @return Future representing pending completion of the operation.
      * @see TableNotFoundException
      */
-    @Deprecated
     public CompletableFuture<Void> alterTableAddColumnAsync(AlterTableAddColumnParams params) {
         if (!busyLock.enterBusy()) {
             throw new IgniteException(new NodeStoppingException());
@@ -1735,7 +1714,6 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      * @return Future representing pending completion of the operation.
      * @see TableNotFoundException
      */
-    @Deprecated
     public CompletableFuture<Void> alterTableDropColumnAsync(AlterTableDropColumnParams params) {
         if (!busyLock.enterBusy()) {
             throw new IgniteException(new NodeStoppingException());
@@ -1826,23 +1804,6 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
         return (ex instanceof IgniteException) ? (IgniteException) ex : IgniteExceptionUtils.wrap(ex);
     }
 
-    /**
-     * Drops a table with the name specified. If appropriate table does not be found, a future will be completed with
-     * {@link TableNotFoundException}.
-     *
-     * @param name Table name.
-     * @return Future representing pending completion of the operation.
-     * @throws IgniteException If an unspecified platform exception has happened internally. Is thrown when:
-     *         <ul>
-     *             <li>the node is stopping.</li>
-     *         </ul>
-     * @see TableNotFoundException
-     */
-    @Deprecated(forRemoval = true)
-    public CompletableFuture<Void> dropTableAsync(String name) {
-        throw new UnsupportedOperationException("Method is no longer supported.");
-    }
-
     /**
      * Drops a table with the name specified. If appropriate table does not be found, a future will be completed with
      * {@link TableNotFoundException}.
@@ -1851,7 +1812,6 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
      * @return Future representing pending completion of the operation.
      * @see TableNotFoundException
      */
-    @Deprecated
     public CompletableFuture<Void> dropTableAsync(DropTableParams params) {
         if (!busyLock.enterBusy()) {
             throw new IgniteException(new NodeStoppingException());
@@ -1865,6 +1825,7 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
     }
 
     /** See {@link #dropTableAsync(DropTableParams)} for details. */
+    @Deprecated(forRemoval = true)
     private CompletableFuture<Void> dropTableAsyncInternal(String name) {
         return tableAsyncInternal(name).thenCompose(tbl -> {
             // In case of drop it's an optimization that allows not to fire drop-change-closure if there's no such


[ignite-3] 01/06: Mirror DistributionZone changes from Config to Catalog.

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8392fe8631fbb5038f69ace2c8c07bd44a0e599d
Author: amashenkov <an...@gmail.com>
AuthorDate: Tue Jul 4 23:29:33 2023 +0300

    Mirror DistributionZone changes from Config to Catalog.
---
 .../internal/catalog/CatalogServiceImpl.java       |  6 +-
 .../catalog/descriptors/CatalogZoneDescriptor.java |  3 +
 modules/distribution-zones/build.gradle            |  2 +
 .../distributionzones/DistributionZoneManager.java | 74 ++++++++++++++++++++--
 .../BaseDistributionZoneManagerTest.java           |  1 +
 ...ibutionZoneManagerConfigurationChangesTest.java |  1 +
 .../DistributionZoneManagerTest.java               |  1 +
 .../DistributionZoneMockTest.java                  |  2 +
 .../DistributionZonesTestUtil.java                 | 34 ++++++++++
 .../storage/ItRebalanceDistributedTest.java        |  1 +
 ...niteDistributionZoneManagerNodeRestartTest.java |  2 +
 .../runner/app/ItIgniteNodeRestartTest.java        | 15 +++--
 .../org/apache/ignite/internal/app/IgniteImpl.java | 21 +++---
 .../engine/exec/ddl/DdlCommandHandlerWrapper.java  | 34 ----------
 .../DdlCommandHandlerExceptionHandlingTest.java    | 28 ++++----
 15 files changed, 151 insertions(+), 74 deletions(-)

diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
index a1981a8924..cc6f54b1a0 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
@@ -149,18 +149,18 @@ public class CatalogServiceImpl extends Producer<CatalogEvent, CatalogEventParam
 
     @Override
     public void start() {
-        int objectIdGen = 0;
+        int objectIdGen = 1;
 
         // TODO: IGNITE-19082 Move default schema objects initialization to cluster init procedure.
         CatalogSchemaDescriptor schemaPublic = new CatalogSchemaDescriptor(
-                objectIdGen++,
+                0,
                 DEFAULT_SCHEMA_NAME,
                 new CatalogTableDescriptor[0],
                 new CatalogIndexDescriptor[0]
         );
 
         CatalogZoneDescriptor defaultZone = new CatalogZoneDescriptor(
-                objectIdGen++,
+                0,
                 DEFAULT_ZONE_NAME,
                 25,
                 1,
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
index fd636e2b68..01fd779cb0 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
@@ -76,6 +76,9 @@ public class CatalogZoneDescriptor extends CatalogObjectDescriptor {
         this.dataNodesAutoAdjustScaleUp = dataNodesAutoAdjustScaleUp;
         this.dataNodesAutoAdjustScaleDown = dataNodesAutoAdjustScaleDown;
         this.filter = filter;
+
+        // TODO: IGNITE-19719 Fix it
+        this.dataStorage = new CatalogDataStorageDescriptor("aipersist", "default");
     }
 
     /**
diff --git a/modules/distribution-zones/build.gradle b/modules/distribution-zones/build.gradle
index c0d38eff4f..ab2b03d87d 100644
--- a/modules/distribution-zones/build.gradle
+++ b/modules/distribution-zones/build.gradle
@@ -26,6 +26,7 @@ dependencies {
     annotationProcessor project(":ignite-configuration-annotation-processor")
     annotationProcessor libs.auto.service
 
+    implementation project(':ignite-catalog')
     implementation project(':ignite-core')
     implementation project(':ignite-configuration-api')
     implementation project(':ignite-api')
@@ -65,6 +66,7 @@ dependencies {
     testFixturesImplementation libs.mockito.core
     testFixturesImplementation libs.mockito.junit
     testFixturesImplementation libs.hamcrest.core
+    testFixturesImplementation project(':ignite-catalog')
     testFixturesImplementation project(':ignite-raft-api')
     testFixturesImplementation project(':ignite-metastorage')
     testFixturesImplementation project(':ignite-schema')
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
index d61f044560..97863daf36 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.distributionzones;
 
 import static java.util.Collections.emptySet;
+import static java.util.concurrent.CompletableFuture.allOf;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
@@ -92,6 +93,12 @@ import org.apache.ignite.configuration.notifications.ConfigurationListener;
 import org.apache.ignite.configuration.notifications.ConfigurationNamedListListener;
 import org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
 import org.apache.ignite.configuration.validation.ConfigurationValidationException;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
+import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
+import org.apache.ignite.internal.catalog.commands.DropZoneParams;
+import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
+import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologyEventListener;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologyService;
@@ -185,6 +192,9 @@ public class DistributionZoneManager implements IgniteComponent {
     /** Tables configuration. */
     private final TablesConfiguration tablesConfiguration;
 
+    /** Catalog service. */
+    private final CatalogManager catalogManager;
+
     /** Meta Storage manager. */
     private final MetaStorageManager metaStorageManager;
 
@@ -256,6 +266,7 @@ public class DistributionZoneManager implements IgniteComponent {
      *
      * @param zonesConfiguration Distribution zones configuration.
      * @param tablesConfiguration Tables configuration.
+     * @param catalogManager Catalog manager.
      * @param metaStorageManager Meta Storage manager.
      * @param logicalTopologyService Logical topology service.
      * @param vaultMgr Vault manager.
@@ -264,6 +275,7 @@ public class DistributionZoneManager implements IgniteComponent {
     public DistributionZoneManager(
             DistributionZonesConfiguration zonesConfiguration,
             TablesConfiguration tablesConfiguration,
+            CatalogManager catalogManager,
             MetaStorageManager metaStorageManager,
             LogicalTopologyService logicalTopologyService,
             VaultManager vaultMgr,
@@ -274,6 +286,7 @@ public class DistributionZoneManager implements IgniteComponent {
         this.metaStorageManager = metaStorageManager;
         this.logicalTopologyService = logicalTopologyService;
         this.vaultMgr = vaultMgr;
+        this.catalogManager = catalogManager;
 
         this.topologyWatchListener = createMetastorageTopologyListener();
 
@@ -386,9 +399,37 @@ public class DistributionZoneManager implements IgniteComponent {
         }
 
         try {
-            CompletableFuture<Integer> fut = new CompletableFuture<>();
+            return catalogManager.createDistributionZone(CreateZoneParams.builder()
+                            .zoneName(distributionZoneCfg.name())
+                            .partitions(distributionZoneCfg.partitions())
+                            .filter(distributionZoneCfg.filter())
+                            .replicas(distributionZoneCfg.replicas())
+                            .dataNodesAutoAdjust(distributionZoneCfg.dataNodesAutoAdjust())
+                            .dataNodesAutoAdjustScaleUp(distributionZoneCfg.dataNodesAutoAdjustScaleUp())
+                            .dataNodesAutoAdjustScaleDown(distributionZoneCfg.dataNodesAutoAdjustScaleDown())
+                            .build())
+                    .thenApply(ignore -> catalogManager.zone(distributionZoneCfg.name(), Long.MAX_VALUE))
+                    .thenCompose(zoneDescriptor -> createZone(zoneDescriptor.id(), distributionZoneCfg))
+                    .whenComplete((id, ex) -> {
+                        if (ex != null) {
+                            LOG.warn("Failed to create zone.", ex);
+                        }
+                    });
+        } finally {
+            busyLock.leaveBusy();
+        }
+    }
 
-            int[] zoneIdContainer = new int[1];
+    private CompletableFuture<Integer> createZone(
+            int intZoneId,
+            DistributionZoneConfigurationParameters distributionZoneCfg
+    ) {
+        if (!busyLock.enterBusy()) {
+            return failedFuture(new NodeStoppingException());
+        }
+
+        try {
+            CompletableFuture<Integer> fut = new CompletableFuture<>();
 
             zonesConfiguration.change(zonesChange -> zonesChange.changeDistributionZones(zonesListChange -> {
                 try {
@@ -427,11 +468,9 @@ public class DistributionZoneManager implements IgniteComponent {
                             zoneChange.changeDataNodesAutoAdjustScaleDown(distributionZoneCfg.dataNodesAutoAdjustScaleDown());
                         }
 
-                        int intZoneId = zonesChange.globalIdCounter() + 1;
                         zonesChange.changeGlobalIdCounter(intZoneId);
 
                         zoneChange.changeZoneId(intZoneId);
-                        zoneIdContainer[0] = intZoneId;
                     });
                 } catch (ConfigurationNodeAlreadyExistException e) {
                     throw new DistributionZoneAlreadyExistsException(distributionZoneCfg.name(), e);
@@ -445,7 +484,7 @@ public class DistributionZoneManager implements IgniteComponent {
                                     ConfigurationValidationException.class)
                     );
                 } else {
-                    fut.complete(zoneIdContainer[0]);
+                    fut.complete(intZoneId);
                 }
             });
 
@@ -496,6 +535,23 @@ public class DistributionZoneManager implements IgniteComponent {
         try {
             CompletableFuture<Void> fut = new CompletableFuture<>();
 
+            CompletableFuture<Void> catalogFut = catalogManager.alterDistributionZone(AlterZoneParams.builder()
+                    .zoneName(name)
+                    .partitions(distributionZoneCfg.partitions())
+                    .replicas(distributionZoneCfg.replicas())
+                    .filter(distributionZoneCfg.filter())
+                    .dataNodesAutoAdjust(distributionZoneCfg.dataNodesAutoAdjust())
+                    .dataNodesAutoAdjustScaleUp(distributionZoneCfg.dataNodesAutoAdjustScaleUp())
+                    .dataNodesAutoAdjustScaleDown(distributionZoneCfg.dataNodesAutoAdjustScaleDown())
+                    .build());
+
+            if (!name.equals(distributionZoneCfg.name())) {
+                catalogFut = catalogFut.thenCompose(ignore -> catalogManager.renameDistributionZone(RenameZoneParams.builder()
+                        .zoneName(name)
+                        .newZoneName(distributionZoneCfg.name())
+                        .build()));
+            }
+
             CompletableFuture<Void> change;
 
             if (DEFAULT_ZONE_NAME.equals(name)) {
@@ -524,7 +580,7 @@ public class DistributionZoneManager implements IgniteComponent {
                 }));
             }
 
-            change.whenComplete((res, e) -> {
+            allOf(catalogFut, change).whenComplete((res, e) -> {
                 if (e != null) {
                     fut.completeExceptionally(
                             unwrapDistributionZoneException(
@@ -603,7 +659,11 @@ public class DistributionZoneManager implements IgniteComponent {
                         }
                     });
 
-            return fut;
+            CompletableFuture<Void> dropZoneFut = catalogManager.dropDistributionZone(DropZoneParams.builder()
+                    .zoneName(name)
+                    .build());
+
+            return allOf(dropZoneFut, fut);
         } finally {
             busyLock.leaveBusy();
         }
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/BaseDistributionZoneManagerTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/BaseDistributionZoneManagerTest.java
index 9c69f09930..a9177185e0 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/BaseDistributionZoneManagerTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/BaseDistributionZoneManagerTest.java
@@ -126,6 +126,7 @@ public class BaseDistributionZoneManagerTest extends BaseIgniteAbstractTest {
         distributionZoneManager = new DistributionZoneManager(
                 zonesConfiguration,
                 tablesConfiguration,
+                DistributionZonesTestUtil.mockCatalog(),
                 metaStorageManager,
                 new LogicalTopologyServiceImpl(topology, cmgManager),
                 vaultMgr,
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
index 713ee78a4e..8f58ea7b78 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
@@ -146,6 +146,7 @@ public class DistributionZoneManagerConfigurationChangesTest extends IgniteAbstr
         distributionZoneManager = new DistributionZoneManager(
                 zonesConfiguration,
                 tablesConfiguration,
+                DistributionZonesTestUtil.mockCatalog(),
                 metaStorageManager,
                 logicalTopologyService,
                 vaultMgr,
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java
index 5bd1324a97..8c1bb0fc2a 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java
@@ -99,6 +99,7 @@ class DistributionZoneManagerTest extends IgniteAbstractTest {
         distributionZoneManager = new DistributionZoneManager(
                 zonesConfiguration,
                 tablesConfiguration,
+                DistributionZonesTestUtil.mockCatalog(),
                 null,
                 null,
                 null,
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneMockTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneMockTest.java
index 75db4d543f..17ede4c011 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneMockTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneMockTest.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.mockito.Mockito.mock;
 
 import java.util.concurrent.TimeUnit;
+import org.apache.ignite.internal.catalog.CatalogManager;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologyService;
 import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
@@ -44,6 +45,7 @@ public class DistributionZoneMockTest {
         DistributionZoneManager zoneMgr = new DistributionZoneManager(
                 zonesConfiguration,
                 mock(TablesConfiguration.class),
+                mock(CatalogManager.class),
                 mock(MetaStorageManager.class),
                 mock(LogicalTopologyService.class),
                 mock(VaultManager.class),
diff --git a/modules/distribution-zones/src/testFixtures/java/org/apache/ignite/internal/distributionzones/DistributionZonesTestUtil.java b/modules/distribution-zones/src/testFixtures/java/org/apache/ignite/internal/distributionzones/DistributionZonesTestUtil.java
index 1cdabe81d1..729f15d143 100644
--- a/modules/distribution-zones/src/testFixtures/java/org/apache/ignite/internal/distributionzones/DistributionZonesTestUtil.java
+++ b/modules/distribution-zones/src/testFixtures/java/org/apache/ignite/internal/distributionzones/DistributionZonesTestUtil.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.distributionzones;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_FILTER;
 import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.IMMEDIATE_TIMER_VALUE;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.updateLogicalTopologyAndVersion;
@@ -41,6 +42,11 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.util.Map;
 import java.util.Objects;
@@ -48,9 +54,12 @@ import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
 import org.apache.ignite.internal.distributionzones.DistributionZoneConfigurationParameters.Builder;
 import org.apache.ignite.internal.metastorage.MetaStorageManager;
@@ -486,4 +495,29 @@ public class DistributionZonesTestUtil {
             assertThat(dataNodes, is(expectedValueNames));
         }
     }
+
+    /**
+     * Creates CatalogService mock.
+     */
+    public static CatalogManager mockCatalog() {
+        AtomicInteger idGen = new AtomicInteger(0);
+
+        CatalogManager catalogManager = mock(CatalogManager.class);
+        when(catalogManager.createDistributionZone(any())).thenReturn(completedFuture(null));
+        when(catalogManager.alterDistributionZone(any())).thenReturn(completedFuture(null));
+        when(catalogManager.renameDistributionZone(any())).thenReturn(completedFuture(null));
+        when(catalogManager.dropDistributionZone(any())).thenReturn(completedFuture(null));
+        when(catalogManager.zone(anyString(), anyLong())).thenAnswer(invocation -> zoneDescriptorMock(idGen));
+
+        return catalogManager;
+    }
+
+    private static CatalogZoneDescriptor zoneDescriptorMock(AtomicInteger idGen) {
+        int zoneId = idGen.incrementAndGet();
+
+        CatalogZoneDescriptor descriptor = mock(CatalogZoneDescriptor.class);
+        when(descriptor.id()).thenReturn(zoneId);
+
+        return descriptor;
+    }
 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java
index 77b022c0d4..74573201f7 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItRebalanceDistributedTest.java
@@ -795,6 +795,7 @@ public class ItRebalanceDistributedTest {
             distributionZoneManager = new DistributionZoneManager(
                     zonesCfg,
                     tablesCfg,
+                    catalogManager,
                     metaStorageManager,
                     logicalTopologyService,
                     vaultManager,
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/distribution/zones/ItIgniteDistributionZoneManagerNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/distribution/zones/ItIgniteDistributionZoneManagerNodeRestartTest.java
index daff409fc2..3b2174a6e0 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/distribution/zones/ItIgniteDistributionZoneManagerNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/distribution/zones/ItIgniteDistributionZoneManagerNodeRestartTest.java
@@ -67,6 +67,7 @@ import org.apache.ignite.internal.configuration.validation.ConfigurationValidato
 import org.apache.ignite.internal.distributionzones.DistributionZoneConfigurationParameters;
 import org.apache.ignite.internal.distributionzones.DistributionZoneManager;
 import org.apache.ignite.internal.distributionzones.DistributionZoneManager.ZoneState;
+import org.apache.ignite.internal.distributionzones.DistributionZonesTestUtil;
 import org.apache.ignite.internal.distributionzones.NodeWithAttributes;
 import org.apache.ignite.internal.distributionzones.configuration.DistributionZonesConfiguration;
 import org.apache.ignite.internal.manager.IgniteComponent;
@@ -204,6 +205,7 @@ public class ItIgniteDistributionZoneManagerNodeRestartTest extends BaseIgniteRe
         DistributionZoneManager distributionZoneManager = new DistributionZoneManager(
                 zonesConfiguration,
                 tablesConfiguration,
+                DistributionZonesTestUtil.mockCatalog(),
                 metaStorageMgr,
                 logicalTopologyService,
                 vault,
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index 7a9b323950..2d3c724058 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -338,24 +338,25 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
 
         GcConfiguration gcConfig = clusterConfigRegistry.getConfiguration(GcConfiguration.KEY);
 
+        var clockWaiter = new ClockWaiter("test", hybridClock);
+
+        var catalogManager = new CatalogServiceImpl(
+                new UpdateLogImpl(metaStorageMgr),
+                clockWaiter
+        );
+
         SchemaManager schemaManager = new SchemaManager(registry, tablesConfig, metaStorageMgr);
 
         DistributionZoneManager distributionZoneManager = new DistributionZoneManager(
                 zonesConfig,
                 tablesConfig,
+                catalogManager,
                 metaStorageMgr,
                 logicalTopologyService,
                 vault,
                 name
         );
 
-        var clockWaiter = new ClockWaiter("test", hybridClock);
-
-        var catalogManager = new CatalogServiceImpl(
-                new UpdateLogImpl(metaStorageMgr),
-                clockWaiter
-        );
-
         TableManager tableManager = new TableManager(
                 name,
                 registry,
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index d89c111b1a..c4eda773d6 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -497,9 +497,20 @@ public class IgniteImpl implements Ignite {
 
         schemaManager = new SchemaManager(registry, tablesConfig, metaStorageMgr);
 
+        SchemaSynchronizationConfiguration schemaSyncConfig = clusterConfigRegistry.getConfiguration(
+                SchemaSynchronizationConfiguration.KEY
+        );
+
+        catalogManager = new CatalogServiceImpl(
+                new UpdateLogImpl(metaStorageMgr),
+                clockWaiter,
+                () -> schemaSyncConfig.delayDuration().value()
+        );
+
         distributionZoneManager = new DistributionZoneManager(
                 zonesConfiguration,
                 tablesConfig,
+                catalogManager,
                 metaStorageMgr,
                 logicalTopologyService,
                 vaultMgr,
@@ -510,16 +521,6 @@ public class IgniteImpl implements Ignite {
 
         outgoingSnapshotsManager = new OutgoingSnapshotsManager(clusterSvc.messagingService());
 
-        SchemaSynchronizationConfiguration schemaSyncConfig = clusterConfigRegistry.getConfiguration(
-                SchemaSynchronizationConfiguration.KEY
-        );
-
-        catalogManager = new CatalogServiceImpl(
-                new UpdateLogImpl(metaStorageMgr),
-                clockWaiter,
-                () -> schemaSyncConfig.delayDuration().value()
-        );
-
         distributedTblMgr = new TableManager(
                 name,
                 registry,
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 912c66fe3b..a7a9b7f78e 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
@@ -28,19 +28,13 @@ import org.apache.ignite.internal.index.IndexManager;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterColumnCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableAddCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableDropCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneRenameCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneSetCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateTableCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateZoneCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DdlCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DropIndexCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DropTableCommand;
-import org.apache.ignite.internal.sql.engine.prepare.ddl.DropZoneCommand;
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.table.distributed.TableManager;
-import org.apache.ignite.lang.DistributionZoneAlreadyExistsException;
-import org.apache.ignite.lang.DistributionZoneNotFoundException;
 import org.apache.ignite.lang.IndexAlreadyExistsException;
 import org.apache.ignite.lang.IndexNotFoundException;
 import org.apache.ignite.lang.TableAlreadyExistsException;
@@ -120,34 +114,6 @@ public class DdlCommandHandlerWrapper extends DdlCommandHandler {
                     .thenCompose(res -> catalogManager.dropIndex(DdlToCatalogCommandConverter.convert((DropIndexCommand) cmd))
                             .handle(handleModificationResult(((DropIndexCommand) cmd).ifNotExists(), IndexNotFoundException.class))
                     );
-        } else if (cmd instanceof CreateZoneCommand) {
-            CreateZoneCommand zoneCommand = (CreateZoneCommand) cmd;
-
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.createDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
-                            .handle(handleModificationResult(zoneCommand.ifNotExists(), DistributionZoneAlreadyExistsException.class))
-                    );
-        } else if (cmd instanceof DropZoneCommand) {
-            DropZoneCommand zoneCommand = (DropZoneCommand) cmd;
-
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.dropDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
-                            .handle(handleModificationResult(zoneCommand.ifExists(), DistributionZoneNotFoundException.class))
-                    );
-        } else if (cmd instanceof AlterZoneRenameCommand) {
-            AlterZoneRenameCommand zoneCommand = (AlterZoneRenameCommand) cmd;
-
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.renameDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
-                            .handle(handleModificationResult(zoneCommand.ifExists(), DistributionZoneNotFoundException.class))
-                    );
-        } else if (cmd instanceof AlterZoneSetCommand) {
-            AlterZoneSetCommand zoneCommand = (AlterZoneSetCommand) cmd;
-
-            return ddlCommandFuture
-                    .thenCompose(res -> catalogManager.alterDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
-                            .handle(handleModificationResult(zoneCommand.ifExists(), DistributionZoneNotFoundException.class))
-                    );
         }
 
         return ddlCommandFuture;
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
index 0c42f9fe49..b9e810ecd0 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
@@ -17,23 +17,26 @@
 
 package org.apache.ignite.internal.sql.engine.exec.ddl;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.configuration.annotation.ConfigurationType.DISTRIBUTED;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.apache.ignite.configuration.NamedConfigurationTree;
-import org.apache.ignite.configuration.NamedListView;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
 import org.apache.ignite.internal.configuration.ConfigurationTreeGenerator;
 import org.apache.ignite.internal.configuration.storage.TestConfigurationStorage;
@@ -42,9 +45,6 @@ import org.apache.ignite.internal.distributionzones.DistributionZoneConfiguratio
 import org.apache.ignite.internal.distributionzones.DistributionZoneManager;
 import org.apache.ignite.internal.distributionzones.configuration.DistributionZonesConfiguration;
 import org.apache.ignite.internal.index.IndexManager;
-import org.apache.ignite.internal.schema.configuration.TableChange;
-import org.apache.ignite.internal.schema.configuration.TableConfiguration;
-import org.apache.ignite.internal.schema.configuration.TableView;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateZoneCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.DropZoneCommand;
 import org.apache.ignite.internal.storage.DataStorageManager;
@@ -106,17 +106,19 @@ public class DdlCommandHandlerExceptionHandlingTest extends IgniteAbstractTest {
 
         DistributionZonesConfiguration zonesConfiguration = registry.getConfiguration(DistributionZonesConfiguration.KEY);
 
-        NamedConfigurationTree<TableConfiguration, TableView, TableChange> tables = mock(NamedConfigurationTree.class);
-
-        NamedListView<TableView> value = mock(NamedListView.class);
-
-        when(tables.value()).thenReturn(value);
-
-        when(value.namedListKeys()).thenReturn(new ArrayList<>());
+        CatalogManager catalogManager = mock(CatalogManager.class);
+        when(catalogManager.createDistributionZone(any())).thenReturn(completedFuture(null));
+        when(catalogManager.alterDistributionZone(any())).thenReturn(completedFuture(null));
+        when(catalogManager.renameDistributionZone(any())).thenReturn(completedFuture(null));
+        when(catalogManager.dropDistributionZone(any())).thenReturn(completedFuture(null));
+        CatalogZoneDescriptor desc = mock(CatalogZoneDescriptor.class);
+        when(catalogManager.zone(anyString(), anyLong())).thenReturn(desc);
+        when(desc.id()).thenReturn(42);
 
         distributionZoneManager = new DistributionZoneManager(
                 zonesConfiguration,
                 null,
+                catalogManager,
                 null,
                 null,
                 null,


[ignite-3] 05/06: Minor.

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a3c253a40fc83b6f57d9dc0ff4ca53de19a2150c
Author: amashenkov <an...@gmail.com>
AuthorDate: Wed Jul 19 12:25:52 2023 +0300

    Minor.
---
 .../java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
index e4a80697db..cc6f54b1a0 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
@@ -153,7 +153,7 @@ public class CatalogServiceImpl extends Producer<CatalogEvent, CatalogEventParam
 
         // TODO: IGNITE-19082 Move default schema objects initialization to cluster init procedure.
         CatalogSchemaDescriptor schemaPublic = new CatalogSchemaDescriptor(
-                objectIdGen++,
+                0,
                 DEFAULT_SCHEMA_NAME,
                 new CatalogTableDescriptor[0],
                 new CatalogIndexDescriptor[0]


[ignite-3] 06/06: Resolve conflicts.

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f151119f2b4c4520642a19dc2f5d43408779764e
Author: amashenkov <an...@gmail.com>
AuthorDate: Wed Jul 19 15:12:15 2023 +0300

    Resolve conflicts.
---
 .../org/apache/ignite/internal/schema/CatalogDescriptorUtils.java     | 1 +
 .../apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java | 2 +-
 .../org/apache/ignite/internal/table/distributed/TableManager.java    | 4 ++--
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java
index 54dca3f1b1..bcff576238 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogDescriptorUtils.java
@@ -254,6 +254,7 @@ public class CatalogDescriptorUtils {
         colTypeChg.changeType(typeName);
 
         switch (spec) {
+            case BOOLEAN:
             case INT8:
             case INT16:
             case INT32:
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
index e8ec21d5eb..9c9b9622bc 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
@@ -21,7 +21,6 @@ import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
-import static org.apache.ignite.lang.ErrorGroups.Sql.UNSUPPORTED_DDL_OPERATION_ERR;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
@@ -52,6 +51,7 @@ import org.apache.ignite.lang.IndexAlreadyExistsException;
 import org.apache.ignite.lang.IndexNotFoundException;
 import org.apache.ignite.lang.TableAlreadyExistsException;
 import org.apache.ignite.lang.TableNotFoundException;
+import org.apache.ignite.sql.SqlException;
 
 /** DDL commands handler. */
 public class DdlCommandHandler {
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index 2da7a08ef3..aafc1e8c39 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -45,7 +45,7 @@ import static org.apache.ignite.internal.utils.RebalanceUtil.extractPartitionNum
 import static org.apache.ignite.internal.utils.RebalanceUtil.extractTableId;
 import static org.apache.ignite.internal.utils.RebalanceUtil.pendingPartAssignmentsKey;
 import static org.apache.ignite.internal.utils.RebalanceUtil.stablePartAssignmentsKey;
-import static org.apache.ignite.lang.ErrorGroups.Sql.DROP_IDX_COLUMN_CONSTRAINT_ERR;
+import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.io.IOException;
@@ -2898,7 +2898,7 @@ public class TableManager extends Producer<TableEvent, TableEventParameters> imp
                             }
 
                             if (primaryCols.contains(colName)) {
-                                throw new SqlException(DROP_IDX_COLUMN_CONSTRAINT_ERR, IgniteStringFormatter
+                                throw new SqlException(STMT_VALIDATION_ERR, IgniteStringFormatter
                                         .format("Can`t delete column, belongs to primary key: [name={}]", colName));
                             }
                         }