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

[ignite-3] branch main updated: IGNITE-17630 Remove org.apache.ignite.schema.definition package from public API (#1109)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 70347a499d IGNITE-17630 Remove org.apache.ignite.schema.definition package from public API (#1109)
70347a499d is described below

commit 70347a499d499709d5f5f28793688569d504ba89
Author: korlov42 <ko...@gridgain.com>
AuthorDate: Fri Sep 23 10:57:49 2022 +0300

    IGNITE-17630 Remove org.apache.ignite.schema.definition package from public API (#1109)
---
 .../ignite/schema/definition/package-info.java     |  22 --
 .../apache/ignite/table/mapper/TypeConverter.java  |   4 +-
 .../ignite/internal/cli/IntegrationTestBase.java   |   6 +-
 .../ignite/internal/jdbc/JdbcConnection.java       |   7 +-
 .../apache/ignite/internal/util/IgniteUtils.java   |  34 ++
 .../ignite/internal/index/IndexManagerTest.java    |  10 +-
 .../ignite/internal/ItNoSyncMetadataTest.java      |   2 +-
 .../storage/ItRebalanceDistributedTest.java        |   6 +-
 .../inmemory/ItRaftStorageVolatilityTest.java      |   6 +-
 .../runner/app/AbstractSchemaChangeTest.java       |   8 +-
 .../internal/runner/app/ItDataSchemaSyncTest.java  |   8 +-
 .../runner/app/ItDynamicTableCreationTest.java     |   6 +-
 .../app/ItIgniteInMemoryNodeRestartTest.java       |   6 +-
 .../runner/app/ItIgniteNodeRestartTest.java        |   6 +-
 .../internal/runner/app/ItNoThreadsLeftTest.java   |   4 +-
 .../runner/app/ItSchemaChangeKvViewTest.java       |   4 +-
 .../runner/app/ItSchemaChangeTableViewTest.java    |   4 +-
 .../runner/app/ItTableApiContractTest.java         |   4 +-
 .../internal/runner/app/ItTablesApiTest.java       |   6 +-
 .../runner/app/PlatformTestNodeRunner.java         |   6 +-
 .../app/client/ItAbstractThinClientTest.java       |   6 +-
 .../runner/app/jdbc/ItJdbcMetadataSelfTest.java    |  66 +---
 .../runner/app/jdbc/ItJdbcResultSetSelfTest.java   |  84 ++---
 .../sql/engine/AbstractBasicIntegrationTest.java   |   6 +-
 .../internal/sql/engine/ItCreateTableDdlTest.java  |   4 +-
 .../internal/sql/engine/ItFunctionsTest.java       |  27 +-
 .../ignite/internal/sql/engine/ItJoinTest.java     |   2 +-
 .../ignite/internal/sql/engine/ItMetadataTest.java |  19 +-
 .../internal/sql/engine/ItMixedQueriesTest.java    |  30 +-
 .../internal/sql/engine/ItOrToUnionRuleTest.java   |   6 +-
 .../sql/engine/ItProjectScanMergeRuleTest.java     |  27 +-
 .../internal/sql/engine/ItSecondaryIndexTest.java  |  62 +---
 .../ignite/internal/sql/engine/ItSetOpTest.java    |  67 +---
 .../ignite/internal/schema/DecimalNativeType.java  |   6 +
 .../apache/ignite/internal/schema/NativeTypes.java |   8 +-
 .../apache/ignite/internal/schema/SchemaUtils.java |  12 +-
 .../ignite/internal/schema/TemporalNativeType.java |  24 +-
 .../configuration/ColumnTypeValidatorImpl.java     |  83 ++++-
 .../ConfigurationToSchemaDescriptorConverter.java  | 191 ++++++++++
 .../schema/configuration/IndexValidatorImpl.java   |  89 +++--
 .../configuration/SchemaDescriptorConverter.java   | 225 ------------
 .../schema/configuration/TableValidatorImpl.java   | 102 +++++-
 .../configuration/ValueSerializationHelper.java    | 129 +++++++
 .../schema/definition/SchemaValidationUtils.java   | 116 ------
 .../ignite/internal/schema/row/RowAssembler.java   |   4 +-
 .../ignite/internal/schema/NativeTypeTest.java     |  47 ---
 .../internal/schema/SchemaConfigurationTest.java   |   4 +-
 .../ignite/internal/schema/TemporalTypesTest.java  |   2 +-
 .../builder/ColumnDefinitionBuilderTest.java       |   8 +-
 .../builder/HashIndexDefinitionBuilderTest.java    |   2 +-
 .../PrimaryKeyDefinitionDefinitionBuilderTest.java |   2 +-
 .../builder/SortedIndexDefinitionBuilderTest.java  |   4 +-
 .../schema/builder/TableDefinitionBuilderTest.java |   4 +-
 .../configuration/AbstractSchemaConverterTest.java |  90 ++---
 .../AbstractTableIndexValidatorTest.java           |   5 +-
 ...nfigurationToSchemaDescriptorConverterTest.java | 308 ++++++++++++++++
 .../configuration/IndexValidatorImplTest.java      |  69 ----
 .../SchemaConfigurationConverterTest.java          | 388 ---------------------
 .../SchemaDescriptorConverterTest.java             | 296 ----------------
 .../schema/serializer/AbstractSerializerTest.java  |   7 +-
 .../testutils}/SchemaConfigurationConverter.java   |  79 +++--
 .../testutils/builder/ColumnDefinitionBuilder.java |   2 +-
 .../builder/ColumnDefinitionBuilderImpl.java       |   8 +-
 .../builder/HashIndexDefinitionBuilder.java        |   2 +-
 .../builder/HashIndexDefinitionBuilderImpl.java    |   4 +-
 .../builder/PrimaryKeyDefinitionBuilder.java       |   2 +-
 .../builder/PrimaryKeyDefinitionBuilderImpl.java   |   4 +-
 .../schema/testutils/builder/SchemaBuilders.java   |   5 +-
 .../builder/SortedIndexDefinitionBuilder.java      |   2 +-
 .../builder/SortedIndexDefinitionBuilderImpl.java  |  10 +-
 .../testutils/builder/TableDefinitionBuilder.java  |   9 +-
 .../builder/TableDefinitionBuilderImpl.java        |  11 +-
 .../definition/AbstractSchemaObject.java           |   3 +-
 .../testutils}/definition/ColumnDefinition.java    |   2 +-
 .../definition/ColumnDefinitionImpl.java           |   5 +-
 .../schema/testutils}/definition/ColumnType.java   |  10 +-
 .../definition/DefaultValueDefinition.java         |   2 +-
 .../definition/DefaultValueGenerators.java         |   2 +-
 .../definition/PrimaryKeyDefinition.java           |   2 +-
 .../schema/testutils}/definition/SchemaObject.java |   2 +-
 .../testutils}/definition/TableDefinition.java     |   2 +-
 .../testutils}/definition/TableDefinitionImpl.java |   5 +-
 .../definition/index/ColumnarIndexDefinition.java  |   2 +-
 .../definition/index/HashIndexDefinition.java      |   2 +-
 .../definition/index/HashIndexDefinitionImpl.java  |   8 +-
 .../definition/index/IndexColumnDefinition.java    |   2 +-
 .../index/IndexColumnDefinitionImpl.java           |   7 +-
 .../definition/index/IndexDefinition.java          |   4 +-
 .../definition/index/PrimaryKeyDefinitionImpl.java |   6 +-
 .../testutils}/definition/index/SortOrder.java     |   2 +-
 .../index/SortedIndexColumnDefinition.java         |   2 +-
 .../index/SortedIndexColumnDefinitionImpl.java     |   6 +-
 .../definition/index/SortedIndexDefinition.java    |   2 +-
 .../index/SortedIndexDefinitionImpl.java           |  10 +-
 .../testutils}/definition/index/package-info.java  |   2 +-
 .../sql/engine/exec/ddl/DdlCommandHandler.java     |  77 +++-
 .../engine/prepare/ddl/DefaultValueDefinition.java |   2 -
 .../sql/engine/property/PropertiesHelper.java      |  25 +-
 .../sql/engine/type/IgniteTypeFactory.java         |  43 +--
 .../internal/sql/engine/type/IgniteTypeSystem.java |   6 +-
 .../sql/engine/property/PropertiesHelperTest.java  |   2 +-
 .../storage/index/HashIndexDescriptor.java         |   5 +-
 .../internal/storage/index/HashIndexStorage.java   |   2 -
 .../storage/index/SortedIndexDescriptor.java       |   5 +-
 .../internal/storage/index/SortedIndexStorage.java |   2 -
 .../index/AbstractSortedIndexStorageTest.java      |  14 +-
 .../storage/AbstractMvTableStorageTest.java        |   8 +-
 .../index/AbstractHashIndexStorageTest.java        |  12 +-
 .../internal/table/MutableRowTupleAdapterTest.java |   2 +-
 .../table/distributed/TableManagerTest.java        |   6 +-
 110 files changed, 1377 insertions(+), 1852 deletions(-)

diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/package-info.java b/modules/api/src/main/java/org/apache/ignite/schema/definition/package-info.java
deleted file mode 100644
index 17a0ede46c..0000000000
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/package-info.java
+++ /dev/null
@@ -1,22 +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.
- */
-
-/**
- * Contains table schema definition interfaces and classes.
- */
-
-package org.apache.ignite.schema.definition;
diff --git a/modules/api/src/main/java/org/apache/ignite/table/mapper/TypeConverter.java b/modules/api/src/main/java/org/apache/ignite/table/mapper/TypeConverter.java
index ba1e0fe078..671eb279ca 100644
--- a/modules/api/src/main/java/org/apache/ignite/table/mapper/TypeConverter.java
+++ b/modules/api/src/main/java/org/apache/ignite/table/mapper/TypeConverter.java
@@ -17,14 +17,12 @@
 
 package org.apache.ignite.table.mapper;
 
-import org.apache.ignite.schema.definition.ColumnType;
-
 /**
  * Type converter interface provides methods for additional transformation for data of the field type to a type, which is compatible with
  * the column type, and vice versa.
  *
  * <p>The converter can be used to convert object (or their fields), which type is incompatible with the schema.
- * E.g. serialize an arbitrary object to a byte[] for storing is a BLOB column {@link ColumnType#blob()}.
+ * E.g. serialize an arbitrary object to a byte[] for storing is a BLOB column.
  *
  * @param <ObjectT> Object type.
  * @param <ColumnT> Column type.
diff --git a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/IntegrationTestBase.java b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/IntegrationTestBase.java
index 7f47bd641a..5de2e981b0 100644
--- a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/IntegrationTestBase.java
+++ b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/IntegrationTestBase.java
@@ -42,9 +42,11 @@ import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.builder.TableDefinitionBuilder;
+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.AsyncCursor;
 import org.apache.ignite.internal.sql.engine.AsyncCursor.BatchedResult;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
@@ -52,8 +54,6 @@ import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteStringFormatter;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/jdbc/JdbcConnection.java b/modules/client/src/main/java/org/apache/ignite/internal/jdbc/JdbcConnection.java
index d5f00a07f9..724debb087 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/jdbc/JdbcConnection.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/jdbc/JdbcConnection.java
@@ -55,7 +55,6 @@ import org.apache.ignite.internal.client.HostAndPortRange;
 import org.apache.ignite.internal.client.TcpIgniteClient;
 import org.apache.ignite.internal.jdbc.proto.JdbcQueryEventHandler;
 import org.apache.ignite.internal.jdbc.proto.SqlStateCode;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -65,6 +64,8 @@ public class JdbcConnection implements Connection {
     /** Network timeout permission. */
     private static final String SET_NETWORK_TIMEOUT_PERM = "setNetworkTimeout";
 
+    private static final String DEFAULT_SCHEMA_NAME = "PUBLIC";
+
     /** Statements modification mutex. */
     private final Object stmtsMux = new Object();
 
@@ -124,7 +125,7 @@ public class JdbcConnection implements Connection {
 
         holdability = HOLD_CURSORS_OVER_COMMIT;
 
-        schema = TableDefinition.DEFAULT_DATABASE_SCHEMA_NAME;
+        schema = DEFAULT_SCHEMA_NAME;
 
         client = null;
     }
@@ -834,7 +835,7 @@ public class JdbcConnection implements Connection {
      */
     public static String normalizeSchema(String schemaName) {
         if (schemaName == null || schemaName.isEmpty()) {
-            return TableDefinition.DEFAULT_DATABASE_SCHEMA_NAME;
+            return DEFAULT_SCHEMA_NAME;
         }
 
         String res;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 4e0820b61b..20f2f36a7a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -20,6 +20,8 @@ package org.apache.ignite.internal.util;
 import static org.apache.ignite.lang.ErrorGroups.Common.NODE_STOPPING_ERR;
 
 import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.nio.ByteBuffer;
 import java.nio.file.AtomicMoveNotSupportedException;
 import java.nio.file.FileVisitResult;
@@ -31,10 +33,12 @@ import java.nio.file.StandardCopyOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CancellationException;
@@ -828,4 +832,34 @@ public class IgniteUtils {
             busyLock.leaveBusy();
         }
     }
+
+    /**
+     * Collects all the fields of given class which are defined as a public static within the specified class.
+     *
+     * @param sourceCls The class to lookup fields in.
+     * @param targetCls Type of the fields of interest.
+     * @return A mapping name to property itself.
+     */
+    public static <T> List<T> collectStaticFields(Class<?> sourceCls, Class<? extends T> targetCls) {
+        List<T> result = new ArrayList<>();
+
+        for (Field f : sourceCls.getDeclaredFields()) {
+            if (!targetCls.equals(f.getType())
+                    || !Modifier.isStatic(f.getModifiers())
+                    || !Modifier.isPublic(f.getModifiers())) {
+                continue;
+            }
+
+            try {
+                T value = targetCls.cast(f.get(sourceCls));
+
+                result.add(value);
+            } catch (IllegalAccessException e) {
+                // should not happen
+                throw new AssertionError(e);
+            }
+        }
+
+        return result;
+    }
 }
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 a7e69308aa..e08938d991 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
@@ -72,7 +72,6 @@ import org.apache.ignite.internal.index.event.IndexEventParameters;
 import org.apache.ignite.internal.schema.configuration.IndexValidatorImpl;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.lang.ErrorGroups;
-import org.apache.ignite.lang.ErrorGroups.Table;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.apache.ignite.lang.IndexNotFoundException;
 import org.apache.ignite.lang.TableNotFoundException;
@@ -232,7 +231,7 @@ public class IndexManagerTest {
         );
 
         assertTrue(IgniteTestUtils.hasCause(completionException, ConfigurationValidationException.class,
-                "At least one column should be specified"));
+                "Index must include at least one column"));
 
         assertThat(
                 (IgniteTestUtils.cause(completionException, ConfigurationValidationException.class)).getMessage(),
@@ -253,12 +252,7 @@ public class IndexManagerTest {
         );
 
         assertTrue(IgniteTestUtils.hasCause(completionException, ConfigurationValidationException.class,
-                "column must exist in the schema"));
-
-        assertThat(
-                (IgniteTestUtils.cause(completionException, ConfigurationValidationException.class)).getMessage(),
-                containsString(Table.TABLE_ERR_GROUP.name())
-        );
+                "Columns don't exist"));
     }
 
     @Test
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java
index a30ffe62c9..87d63cb2c6 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/ItNoSyncMetadataTest.java
@@ -20,10 +20,10 @@ package org.apache.ignite.internal;
 import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.testframework.WithSystemProperty;
-import org.apache.ignite.schema.definition.ColumnType;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
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 98f7f26dbe..2cfe1ff0af 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
@@ -62,8 +62,10 @@ import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.server.impl.JraftServerImpl;
 import org.apache.ignite.internal.raft.storage.impl.LocalLogStorageFactory;
 import org.apache.ignite.internal.schema.SchemaManager;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 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.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModules;
 import org.apache.ignite.internal.storage.pagememory.VolatilePageMemoryDataStorageModule;
@@ -90,8 +92,6 @@ import org.apache.ignite.network.NetworkAddress;
 import org.apache.ignite.network.StaticNodeFinder;
 import org.apache.ignite.raft.client.Peer;
 import org.apache.ignite.raft.jraft.rpc.RpcRequests;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.utils.ClusterServiceTestUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
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 9f8730a6ae..1067f4a1e9 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
@@ -38,12 +38,12 @@ import java.util.stream.Stream;
 import org.apache.ignite.configuration.schemas.table.EntryCountBudgetChange;
 import org.apache.ignite.internal.AbstractClusterIntegrationTest;
 import org.apache.ignite.internal.app.IgniteImpl;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 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.storage.pagememory.configuration.schema.VolatilePageMemoryDataStorageChange;
 import org.apache.ignite.internal.table.distributed.TableManager;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.junit.jupiter.api.Test;
 import org.rocksdb.ColumnFamilyDescriptor;
 import org.rocksdb.ColumnFamilyHandle;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java
index 57756205bd..ebc4d6b66f 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/AbstractSchemaChangeTest.java
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.runner.app;
 
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toUnmodifiableList;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -36,14 +36,14 @@ import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.configuration.schemas.table.ColumnChange;
 import org.apache.ignite.configuration.schemas.table.ConstantValueDefaultChange;
 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;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteObjectName;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteException;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDataSchemaSyncTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDataSchemaSyncTest.java
index 2a41d3c33b..a7fe871972 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDataSchemaSyncTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDataSchemaSyncTest.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.runner.app;
 
 import static java.util.stream.Collectors.toList;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -34,15 +34,15 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.internal.app.IgniteImpl;
 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;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.test.WatchListenerInhibitor;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.AfterEach;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java
index bf71f69a1d..796cefca4d 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItDynamicTableCreationTest.java
@@ -37,14 +37,14 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.configuration.schemas.table.ColumnChange;
 import org.apache.ignite.configuration.validation.ConfigurationValidationException;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 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.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteException;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteInMemoryNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteInMemoryNodeRestartTest.java
index 57df0394b8..d7b1b22fbb 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteInMemoryNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteInMemoryNodeRestartTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.runner.app;
 
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -37,6 +37,8 @@ import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.raft.Loza;
 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.storage.pagememory.configuration.schema.VolatilePageMemoryDataStorageChange;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
@@ -47,8 +49,6 @@ import org.apache.ignite.lang.IgniteStringFormatter;
 import org.apache.ignite.network.NetworkAddress;
 import org.apache.ignite.raft.client.Peer;
 import org.apache.ignite.raft.client.service.RaftGroupService;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.intellij.lang.annotations.Language;
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 7e5e84bede..23e2702cd3 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
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.runner.app;
 
 import static java.util.stream.Collectors.joining;
 import static org.apache.ignite.internal.recovery.ConfigurationCatchUpListener.CONFIGURATION_CATCH_UP_DIFFERENCE_PROPERTY;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
@@ -73,6 +73,8 @@ import org.apache.ignite.internal.recovery.ConfigurationCatchUpListener;
 import org.apache.ignite.internal.recovery.RecoveryCompletionFutureFactory;
 import org.apache.ignite.internal.schema.SchemaManager;
 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.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModule;
 import org.apache.ignite.internal.storage.DataStorageModules;
@@ -97,8 +99,6 @@ import org.apache.ignite.network.MessageSerializationRegistryImpl;
 import org.apache.ignite.network.NettyBootstrapFactory;
 import org.apache.ignite.network.scalecube.ScaleCubeClusterServiceFactory;
 import org.apache.ignite.raft.jraft.RaftMessagesSerializationRegistryInitializer;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
 import org.intellij.lang.annotations.Language;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItNoThreadsLeftTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItNoThreadsLeftTest.java
index d2e87395ba..e202575d87 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItNoThreadsLeftTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItNoThreadsLeftTest.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.runner.app;
 
 import static java.util.stream.Collectors.joining;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -32,9 +32,9 @@ import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
-import org.apache.ignite.schema.definition.ColumnType;
 import org.apache.ignite.table.Table;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
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 5cc9c17096..987c0028c0 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
@@ -27,8 +27,8 @@ import java.util.function.Supplier;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.schema.SchemaMismatchException;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
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 d7210cff86..60699e394f 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
@@ -27,8 +27,8 @@ import java.util.function.Supplier;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.schema.SchemaMismatchException;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
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 3836e25d24..803a12b1fa 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
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.runner.app;
 
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -26,10 +26,10 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.sql.engine.AbstractBasicIntegrationTest;
 import org.apache.ignite.lang.TableAlreadyExistsException;
 import org.apache.ignite.lang.TableNotFoundException;
-import org.apache.ignite.schema.definition.ColumnType;
 import org.apache.ignite.table.Table;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
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 71bd56492f..75325c7d87 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
@@ -19,7 +19,7 @@ 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.schema.configuration.SchemaConfigurationConverter.convert;
+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.testNodeName;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
@@ -44,6 +44,8 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.internal.schema.SchemaUtils;
 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;
 import org.apache.ignite.internal.table.IgniteTablesInternal;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.test.WatchListenerInhibitor;
@@ -55,8 +57,6 @@ import org.apache.ignite.lang.IndexAlreadyExistsException;
 import org.apache.ignite.lang.NodeStoppingException;
 import org.apache.ignite.lang.TableAlreadyExistsException;
 import org.apache.ignite.lang.TableNotFoundException;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
 import org.apache.ignite.sql.Session;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
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 816a8c1047..f24b244ad9 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
@@ -30,11 +30,11 @@ import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.compute.ComputeJob;
 import org.apache.ignite.compute.JobExecutionContext;
 import org.apache.ignite.internal.app.IgniteImpl;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 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.util.IgniteUtils;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.table.Table;
 
 /**
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItAbstractThinClientTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItAbstractThinClientTest.java
index 37361d1223..db93336eef 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItAbstractThinClientTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItAbstractThinClientTest.java
@@ -32,15 +32,15 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.internal.app.IgniteImpl;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 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.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.TestInfo;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcMetadataSelfTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcMetadataSelfTest.java
index 65ef06056c..685deceffa 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcMetadataSelfTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcMetadataSelfTest.java
@@ -27,7 +27,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.math.BigDecimal;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.DriverManager;
@@ -42,14 +41,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
-import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.client.proto.ProtocolVersion;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.Table;
-import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -60,38 +52,16 @@ import org.junit.jupiter.api.Test;
 public class ItJdbcMetadataSelfTest extends AbstractJdbcSelfTest {
     /** Creates tables. */
     @BeforeAll
-    public static void createTables() {
+    public static void createTables() throws SQLException {
         assert !clusterNodes.isEmpty();
 
-        TableDefinition perTbl = SchemaBuilders.tableBuilder("PUBLIC", "PERSON").columns(
-                SchemaBuilders.column("NAME", ColumnType.string()).asNullable(true).build(),
-                SchemaBuilders.column("AGE", ColumnType.INT32).asNullable(true).build(),
-                SchemaBuilders.column("ORGID", ColumnType.INT32).build()
-        ).withPrimaryKey("ORGID").build();
-
-        TableDefinition orgTbl = SchemaBuilders.tableBuilder("PUBLIC", "ORGANIZATION").columns(
-                SchemaBuilders.column("ID", ColumnType.INT32).build(),
-                SchemaBuilders.column("NAME", ColumnType.string()).asNullable(true).build(),
-                SchemaBuilders.column("BIGDATA", ColumnType.decimalOf(20, 10)).asNullable(true).build()
-        ).withPrimaryKey("ID").build();
-
-        clusterNodes.get(0).tables().createTable(perTbl.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(perTbl, tblCh)
-                        .changeReplicas(1)
-                        .changePartitions(10)
-        );
-
-        clusterNodes.get(0).tables().createTable(orgTbl.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(orgTbl, tblCh)
-                        .changeReplicas(1)
-                        .changePartitions(10)
-        );
-
-        Table tbl1 = clusterNodes.get(0).tables().table(perTbl.canonicalName());
-        Table tbl2 = clusterNodes.get(0).tables().table(orgTbl.canonicalName());
-
-        tbl1.recordView().insert(null, Tuple.create().set("ORGID", 1).set("NAME", "111").set("AGE", 111));
-        tbl2.recordView().insert(null, Tuple.create().set("ID", 1).set("NAME", "AAA").set("BIGDATA", BigDecimal.valueOf(10)));
+        try (Statement stmt = conn.createStatement()) {
+            stmt.executeUpdate("CREATE TABLE person(name VARCHAR, age INT, orgid INT PRIMARY KEY)");
+            stmt.executeUpdate("INSERT INTO person (orgid, name, age) VALUES (1, '111', 111)");
+
+            stmt.executeUpdate("CREATE TABLE organization(id INT PRIMARY KEY, name VARCHAR, bigdata DECIMAL(20, 10))");
+            stmt.executeUpdate("INSERT INTO organization (id, name, bigdata) VALUES (1, 'AAA', 10)");
+        }
     }
 
     @Test
@@ -159,19 +129,13 @@ public class ItJdbcMetadataSelfTest extends AbstractJdbcSelfTest {
     }
 
     private void createMetaTable() {
-        Ignite ignite = clusterNodes.get(0);
-
-        TableDefinition metaTableDef = SchemaBuilders.tableBuilder("PUBLIC", "METATEST")
-                .columns(
-                        SchemaBuilders.column("DECIMAL_COL", ColumnType.decimal()).build(),
-                        SchemaBuilders.column("DATE_COL", ColumnType.DATE).build(),
-                        SchemaBuilders.column("ID", ColumnType.INT32).asNullable(false).build())
-                .withPrimaryKey("ID")
-                .build();
-
-        ignite.tables().createTable(metaTableDef.canonicalName(), (tableChange) -> {
-            SchemaConfigurationConverter.convert(metaTableDef, tableChange).changeReplicas(1).changePartitions(10);
-        });
+        try (Connection conn = DriverManager.getConnection(URL);
+                Statement stmt = conn.createStatement();
+        ) {
+            stmt.executeUpdate("CREATE TABLE metatest(decimal_col DECIMAL, date_col DATE, id INT PRIMARY KEY)");
+        } catch (SQLException ex) {
+            throw new RuntimeException(ex);
+        }
     }
 
     @Test
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcResultSetSelfTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcResultSetSelfTest.java
index 7c96713e8a..ac1e0b56a9 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcResultSetSelfTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/jdbc/ItJdbcResultSetSelfTest.java
@@ -34,23 +34,12 @@ import java.sql.Date;
 import java.sql.NClob;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.sql.Time;
 import java.sql.Timestamp;
-import java.time.Instant;
 import java.time.LocalDate;
-import java.time.LocalTime;
-import java.util.ArrayList;
 import java.util.GregorianCalendar;
-import java.util.List;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.RecordView;
-import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -70,49 +59,34 @@ public class ItJdbcResultSetSelfTest extends AbstractJdbcSelfTest {
             + "doubleVal, bigVal, strVal from TEST WHERE id = 1";
 
     @BeforeAll
-    public static void beforeClass() {
-        Ignite ignite = clusterNodes.get(0);
-
-        List<ColumnDefinition> columns = new ArrayList<>();
-
-        columns.add(SchemaBuilders.column("ID", ColumnType.INT32).build());
-        columns.add(SchemaBuilders.column("BOOLVAL", ColumnType.INT8).asNullable(true).build());
-        columns.add(SchemaBuilders.column("BYTEVAL", ColumnType.INT8).asNullable(true).build());
-        columns.add(SchemaBuilders.column("SHORTVAL", ColumnType.INT16).asNullable(true).build());
-        columns.add(SchemaBuilders.column("INTVAL", ColumnType.INT32).asNullable(true).build());
-        columns.add(SchemaBuilders.column("LONGVAL", ColumnType.INT64).asNullable(true).build());
-        columns.add(SchemaBuilders.column("FLOATVAL", ColumnType.FLOAT).asNullable(true).build());
-        columns.add(SchemaBuilders.column("DOUBLEVAL", ColumnType.DOUBLE).asNullable(true).build());
-        columns.add(SchemaBuilders.column("BIGVAL", ColumnType.decimal()).asNullable(true).build());
-        columns.add(SchemaBuilders.column("STRVAL", ColumnType.string()).asNullable(true).build());
-        columns.add(SchemaBuilders.column("ARRVAL", ColumnType.blob()).asNullable(true).build());
-        columns.add(SchemaBuilders.column("DATEVAL", ColumnType.DATE).asNullable(true).build());
-        columns.add(SchemaBuilders.column("TIMEVAL", ColumnType.TemporalColumnType.time()).asNullable(true).build());
-        columns.add(SchemaBuilders.column("TSVAL", ColumnType.TemporalColumnType.timestamp()).asNullable(true).build());
-        columns.add(SchemaBuilders.column("URLVAL", ColumnType.blob()).asNullable(true).build());
-
-        TableDefinition personTableDef = SchemaBuilders.tableBuilder("PUBLIC", "TEST")
-                .columns(columns)
-                .withPrimaryKey("ID")
-                .build();
-
-        ignite.tables().createTable(personTableDef.canonicalName(), (tableChange) ->
-                SchemaConfigurationConverter.convert(personTableDef, tableChange).changeReplicas(1).changePartitions(10)
-        );
-
-        RecordView<Tuple> tupleRecordView = ignite.tables().table("PUBLIC.TEST").recordView();
-
-        Tuple tuple = Tuple.create();
-
-        tuple.set("BOOLVAL", (byte) 1).set("BYTEVAL", (byte) 1).set("SHORTVAL", (short) 1)
-            .set("INTVAL", 1).set("LONGVAL", 1L).set("FLOATVAL", 1.0f).set("DOUBLEVAL", 1.0d)
-            .set("BIGVAL", new BigDecimal("1")).set("STRVAL", "1")
-            .set("DATEVAL", LocalDate.parse("1901-02-01"))
-            .set("TIMEVAL", LocalTime.parse("01:01:01"))
-            .set("TSVAL", Instant.ofEpochMilli(1));
-
-        tupleRecordView.insert(null, tuple.set("ID", 1));
-        tupleRecordView.insert(null, tuple.set("ID", 2));
+    public static void beforeClass() throws SQLException {
+        try (Statement stmt = conn.createStatement()) {
+            stmt.executeUpdate("CREATE TABLE test("
+                    + "id INT PRIMARY KEY,"
+                    + "boolval TINYINT,"
+                    + "byteval TINYINT,"
+                    + "shortval SMALLINT,"
+                    + "intval INT,"
+                    + "longval BIGINT,"
+                    + "floatval FLOAT,"
+                    + "doubleval DOUBLE,"
+                    + "bigval DECIMAL(10, 3),"
+                    + "strval VARCHAR,"
+                    + "arrval BINARY,"
+                    + "dateval DATE,"
+                    + "timeval TIME,"
+                    + "tsval TIMESTAMP,"
+                    + "urlval BINARY"
+                    + ")"
+            );
+
+            stmt.executeUpdate("INSERT INTO test ("
+                    + "id, boolval, byteval, shortval, intval, longval, floatval, doubleval, bigval, strval, dateval, timeval, tsval)"
+                    + " VALUES (1, 1, 1, 1, 1, 1, 1.0, 1.0, 1, '1', date '1901-02-01', time '01:01:01', timestamp '1970-01-01 00:00:01')");
+            stmt.executeUpdate("INSERT INTO test ("
+                    + "id, boolval, byteval, shortval, intval, longval, floatval, doubleval, bigval, strval, dateval, timeval, tsval)"
+                    + " VALUES (2, 1, 1, 1, 1, 1, 1.0, 1.0, 1, '1', date '1901-02-01', time '01:01:01', timestamp '1970-01-01 00:00:01')");
+        }
     }
 
     @Test
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
index 7a2d69082e..d1ddc69994 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/AbstractBasicIntegrationTest.java
@@ -42,9 +42,11 @@ import org.apache.ignite.IgnitionManager;
 import org.apache.ignite.internal.app.IgniteImpl;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.builder.TableDefinitionBuilder;
+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.property.PropertiesHolder;
 import org.apache.ignite.internal.sql.engine.session.SessionId;
 import org.apache.ignite.internal.sql.engine.util.QueryChecker;
@@ -53,8 +55,6 @@ import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteStringFormatter;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.sql.ColumnMetadata;
 import org.apache.ignite.sql.Session;
 import org.apache.ignite.table.RecordView;
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 4ea2527281..4f4d97dc65 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
@@ -95,7 +95,7 @@ public class ItCreateTableDdlTest extends AbstractBasicIntegrationTest {
                         IgniteException.class,
                         () -> sql("CREATE TABLE T0(ID0 INT, ID1 INT, VAL INT, PRIMARY KEY (ID1, ID0)) COLOCATE (ID0, VAL)")
                 ).getMessage(),
-                containsString("Schema definition error: All colocation columns must be part of primary key")
+                containsString("Colocation columns must be subset of primary key")
         );
 
         assertThat(
@@ -103,7 +103,7 @@ public class ItCreateTableDdlTest extends AbstractBasicIntegrationTest {
                         IgniteException.class,
                         () -> sql("CREATE TABLE T0(ID0 INT, ID1 INT, VAL INT, PRIMARY KEY (ID1, ID0)) COLOCATE (ID1, ID0, ID1)")
                 ).getMessage(),
-                containsString("Schema definition error: Colocation columns must not be duplicated")
+                containsString("Colocation columns contains duplicates")
         );
     }
 
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
index 2f1f4b10dd..1954f269ba 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
@@ -29,14 +29,8 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.Temporal;
 import org.apache.calcite.sql.validate.SqlValidatorException;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.lang.IgniteException;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.RecordView;
-import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -148,26 +142,11 @@ public class ItFunctionsTest extends AbstractBasicIntegrationTest {
 
     @Test
     public void testRangeWithCache() {
-        TableDefinition tblDef = SchemaBuilders.tableBuilder("PUBLIC", "TEST")
-                .columns(
-                        SchemaBuilders.column("ID", ColumnType.INT32).build(),
-                        SchemaBuilders.column("VAL", ColumnType.INT32).build()
-                )
-                .withPrimaryKey("ID")
-                .build();
-
-        String tblName = tblDef.canonicalName();
-
-        RecordView<Tuple> tbl = CLUSTER_NODES.get(0).tables().createTable(tblDef.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(tblDef, tblCh)
-                        .changeReplicas(1)
-                        .changePartitions(10)
-        ).recordView();
+        sql("CREATE TABLE test(id INT PRIMARY KEY, val INT)");
 
         try {
-
             for (int i = 0; i < 100; i++) {
-                tbl.insert(null, Tuple.create().set("ID", i).set("VAL", i));
+                sql("INSERT INTO test VALUES (?, ?)", i, i);
             }
 
             // Correlated INNER join.
@@ -208,7 +187,7 @@ public class ItFunctionsTest extends AbstractBasicIntegrationTest {
                     .returns(50)
                     .check();
         } finally {
-            CLUSTER_NODES.get(0).tables().dropTable(tblName);
+            sql("DROP TABLE IF EXISTS test");
         }
     }
 
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java
index 2b6613add8..436461a4db 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItJoinTest.java
@@ -20,8 +20,8 @@ package org.apache.ignite.internal.sql.engine;
 import java.util.Arrays;
 import java.util.stream.Collectors;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.apache.ignite.internal.sql.engine.util.QueryChecker;
-import org.apache.ignite.schema.definition.ColumnType;
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.params.ParameterizedTest;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
index 9a5f7b18f4..2eccb35c0c 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMetadataTest.java
@@ -23,14 +23,9 @@ import static org.apache.ignite.sql.ColumnMetadata.UNDEFINED_SCALE;
 
 import java.time.Duration;
 import java.time.Period;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.sql.engine.util.MetadataMatcher;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.sql.SqlColumnType;
 import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -96,20 +91,8 @@ public class ItMetadataTest extends AbstractBasicIntegrationTest {
     }
 
     @Test
-    @Disabled("https://issues.apache.org/jira/browse/IGNITE-16679")
     public void columnOrder() {
-        TableDefinition schTbl1 = SchemaBuilders.tableBuilder("PUBLIC", "COLUMN_ORDER").columns(
-                SchemaBuilders.column("DOUBLE_C", ColumnType.DOUBLE).asNullable(true).build(),
-                SchemaBuilders.column("LONG_C", ColumnType.INT64).build(),
-                SchemaBuilders.column("STRING_C", ColumnType.string()).asNullable(true).build(),
-                SchemaBuilders.column("INT_C", ColumnType.INT32).asNullable(true).build()
-        ).withPrimaryKey("LONG_C").build();
-
-        CLUSTER_NODES.get(0).tables().createTable(schTbl1.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(schTbl1, tblCh)
-                        .changeReplicas(1)
-                        .changePartitions(10)
-        );
+        sql("CREATE TABLE column_order (double_c DOUBLE, long_c BIGINT PRIMARY KEY, string_c VARCHAR, int_c INT)");
 
         assertQuery("select * from column_order")
                 .columnNames("DOUBLE_C", "LONG_C", "STRING_C", "INT_C")
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java
index cad085305b..e15b714ebd 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItMixedQueriesTest.java
@@ -25,11 +25,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.Arrays;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.Table;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -43,11 +38,11 @@ public class ItMixedQueriesTest extends AbstractBasicIntegrationTest {
      */
     @BeforeAll
     static void initTestData() {
-        Table emp1 = createTable("EMP1");
-        Table emp2 = createTable("EMP2");
+        createTable("EMP1");
+        createTable("EMP2");
 
         int idx = 0;
-        insertData(emp1, new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
+        insertData("PUBLIC.EMP1", new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
                 {idx++, "Igor", 10d},
                 {idx++, "Igor", 11d},
                 {idx++, "Igor", 12d},
@@ -58,7 +53,7 @@ public class ItMixedQueriesTest extends AbstractBasicIntegrationTest {
         });
 
         idx = 0;
-        insertData(emp2, new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
+        insertData("PUBLIC.EMP2", new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
                 {idx++, "Roman", 10d},
                 {idx++, "Roman", 11d},
                 {idx++, "Roman", 12d},
@@ -363,20 +358,7 @@ public class ItMixedQueriesTest extends AbstractBasicIntegrationTest {
                 .check();
     }
 
-    private static Table createTable(String tableName) {
-        TableDefinition schTbl1 = SchemaBuilders.tableBuilder("PUBLIC", tableName)
-                .columns(
-                        SchemaBuilders.column("ID", ColumnType.INT32).build(),
-                        SchemaBuilders.column("NAME", ColumnType.string()).asNullable(true).build(),
-                        SchemaBuilders.column("SALARY", ColumnType.DOUBLE).asNullable(true).build()
-                )
-                .withPrimaryKey("ID")
-                .build();
-
-        return CLUSTER_NODES.get(0).tables().createTable(schTbl1.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(schTbl1, tblCh)
-                        .changeReplicas(1)
-                        .changePartitions(10)
-        );
+    private static void createTable(String tableName) {
+        sql("CREATE TABLE " + tableName + "(id INT PRIMARY KEY, name VARCHAR, salary DOUBLE)");
     }
 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java
index 943cdbe753..37ab14b7fb 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItOrToUnionRuleTest.java
@@ -24,10 +24,10 @@ import static org.hamcrest.CoreMatchers.not;
 
 import java.util.List;
 import java.util.Map;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 import org.apache.ignite.table.Table;
 import org.hamcrest.CoreMatchers;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java
index 8447f8ef2d..29fb7ea044 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItProjectScanMergeRuleTest.java
@@ -23,12 +23,7 @@ import static org.apache.ignite.internal.sql.engine.util.QueryChecker.containsOn
 import static org.apache.ignite.internal.sql.engine.util.QueryChecker.containsProject;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.lang.IgniteException;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.Table;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
@@ -45,24 +40,12 @@ public class ItProjectScanMergeRuleTest extends AbstractBasicIntegrationTest {
      */
     @BeforeAll
     static void initTestData() {
-        TableDefinition schTbl1 = SchemaBuilders.tableBuilder("PUBLIC", "PRODUCTS").columns(
-                        SchemaBuilders.column("ID", ColumnType.INT32).build(),
-                        SchemaBuilders.column("CATEGORY", ColumnType.string()).asNullable(true).build(),
-                        SchemaBuilders.column("CAT_ID", ColumnType.INT32).build(),
-                        SchemaBuilders.column("SUBCATEGORY", ColumnType.string()).asNullable(true).build(),
-                        SchemaBuilders.column("SUBCAT_ID", ColumnType.INT32).build(),
-                        SchemaBuilders.column("NAME", ColumnType.string()).asNullable(true).build()
-                )
-                .withPrimaryKey("ID")
-                .build();
-
-        Table tbl = CLUSTER_NODES.get(0).tables().createTable(schTbl1.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(schTbl1, tblCh)
-                        .changeReplicas(1)
-                        .changePartitions(10)
-        );
+        sql("CREATE TABLE products (id INT PRIMARY KEY, category VARCHAR, cat_id INT NOT NULL, subcategory VARCHAR,"
+                + " subcat_id INT NOT NULL, name VARCHAR)");
+
+        sql("CREATE INDEX " + IDX_CAT_ID + " ON products(cat_id)");
 
-        insertData(tbl, new String[]{"ID", "CATEGORY", "CAT_ID", "SUBCATEGORY", "SUBCAT_ID", "NAME"}, new Object[][]{
+        insertData("PUBLIC.PRODUCTS", new String[]{"ID", "CATEGORY", "CAT_ID", "SUBCATEGORY", "SUBCAT_ID", "NAME"}, new Object[][]{
                 {1, "prod1", 1, "cat1", 11, "noname1"},
                 {2, "prod2", 2, "cat1", 11, "noname2"},
                 {3, "prod3", 3, "cat1", 12, "noname3"},
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
index e9ed4ecd07..66f6322cb0 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
@@ -26,13 +26,6 @@ import static org.apache.ignite.internal.sql.engine.util.QueryChecker.containsUn
 import static org.hamcrest.CoreMatchers.anyOf;
 import static org.hamcrest.Matchers.not;
 
-import java.util.List;
-import java.util.Map;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.Table;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -55,32 +48,13 @@ public class ItSecondaryIndexTest extends AbstractBasicIntegrationTest {
      */
     @BeforeAll
     static void initTestData() {
-        TableDefinition tlbDef = SchemaBuilders.tableBuilder("PUBLIC", "DEVELOPER")
-                .columns(
-                        SchemaBuilders.column("ID", ColumnType.INT32).build(),
-                        SchemaBuilders.column("NAME", ColumnType.string()).asNullable(true).build(),
-                        SchemaBuilders.column("DEPID", ColumnType.INT32).asNullable(true).build(),
-                        SchemaBuilders.column("CITY", ColumnType.string()).asNullable(true).build(),
-                        SchemaBuilders.column("AGE", ColumnType.INT32).asNullable(true).build()
-                )
-                .withPrimaryKey("ID")
-                .build();
-
-        Table dev0 = CLUSTER_NODES.get(0).tables().createTable(tlbDef.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(tlbDef, tblCh)
-                        .changeReplicas(2)
-                        .changePartitions(10)
-        );
-
-        Map<String, List<String>> idxs = Map.of(
-                DEPID_IDX, List.of("DEPID"),
-                NAME_CITY_IDX, List.of("DEPID desc", "CITY desc"),
-                NAME_DEPID_CITY_IDX, List.of("NAME", "DEPID desc", "CITY desc")
-        );
+        sql("CREATE TABLE developer (id INT PRIMARY KEY, name VARCHAR, depid INT, city VARCHAR, age INT)");
+        sql("CREATE INDEX " + DEPID_IDX + " ON developer (depid)");
+        sql("CREATE INDEX " + NAME_CITY_IDX + " ON developer (name DESC, city DESC)");
+        sql("CREATE INDEX " + NAME_DEPID_CITY_IDX + " ON developer (name DESC, depid DESC, city DESC)");
 
-        addIndexes(CLUSTER_NODES.get(0), idxs, tlbDef.canonicalName());
 
-        insertData(dev0, new String[]{"ID", "NAME", "DEPID", "CITY", "AGE"}, new Object[][]{
+        insertData("DEVELOPER", new String[]{"ID", "NAME", "DEPID", "CITY", "AGE"}, new Object[][]{
                 {1, "Mozart", 3, "Vienna", 33},
                 {2, "Beethoven", 2, "Vienna", 44},
                 {3, "Bach", 1, "Leipzig", 55},
@@ -106,28 +80,10 @@ public class ItSecondaryIndexTest extends AbstractBasicIntegrationTest {
                 {23, "Musorgskii", 22, "", -1}
         });
 
-        TableDefinition schema1 = SchemaBuilders.tableBuilder("PUBLIC", "UNWRAP_PK")
-                .columns(
-                        SchemaBuilders.column("F1", ColumnType.string()).asNullable(true).build(),
-                        SchemaBuilders.column("F2", ColumnType.INT64).asNullable(true).build(),
-                        SchemaBuilders.column("F3", ColumnType.INT64).asNullable(true).build(),
-                        SchemaBuilders.column("F4", ColumnType.INT64).asNullable(true).build()
-                )
-                .withPrimaryKey(
-                        SchemaBuilders.primaryKey().withColumns("F2", "F1").build()
-                )
-                .build();
-
-        Table dev1 = CLUSTER_NODES.get(0).tables().createTable(schema1.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(schema1, tblCh)
-                        .changeReplicas(2)
-                        .changePartitions(10)
-                        .changePrimaryKey(primaryKeyChange -> {
-                            primaryKeyChange.changeColumns("F2", "F1");
-                        })
-        );
-
-        insertData(dev1, new String[]{"F1", "F2", "F3", "F4"}, new Object[][]{
+        sql("CREATE TABLE unwrap_pk(f1 VARCHAR, f2 BIGINT, f3 BIGINT, f4 BIGINT, primary key(f2, f1))");
+        sql("CREATE INDEX" + PK_IDX + " ON unwrap_pk(f2, f1)");
+
+        insertData("UNWRAP_PK", new String[]{"F1", "F2", "F3", "F4"}, new Object[][]{
                 {"Petr", 1L, 2L, 3L},
                 {"Ivan", 2L, 2L, 4L},
                 {"Ivan1", 21L, 2L, 4L},
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java
index bb85e66186..a947593844 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSetOpTest.java
@@ -21,13 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.function.Predicate;
 import java.util.stream.StreamSupport;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.table.RecordView;
-import org.apache.ignite.table.Table;
-import org.apache.ignite.table.Tuple;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -41,11 +34,11 @@ public class ItSetOpTest extends AbstractBasicIntegrationTest {
      */
     @BeforeAll
     static void initTestData() {
-        Table emp1 = createTable("EMP1");
-        Table emp2 = createTable("EMP2");
+        createTable("EMP1");
+        createTable("EMP2");
 
         int idx = 0;
-        insertData(emp1, new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
+        insertData("PUBLIC.EMP1", new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
                 {idx++, "Igor", 10d},
                 {idx++, "Igor", 11d},
                 {idx++, "Igor", 12d},
@@ -56,7 +49,7 @@ public class ItSetOpTest extends AbstractBasicIntegrationTest {
         });
 
         idx = 0;
-        insertData(emp2, new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
+        insertData("PUBLIC.EMP2", new String[]{"ID", "NAME", "SALARY"}, new Object[][]{
                 {idx++, "Roman", 10d},
                 {idx++, "Roman", 11d},
                 {idx++, "Roman", 12d},
@@ -112,46 +105,19 @@ public class ItSetOpTest extends AbstractBasicIntegrationTest {
     @Test
     @Disabled
     public void testSetOpBigBatch() {
-        TableDefinition schTbl1 = SchemaBuilders.tableBuilder("PUBLIC", "BIG_TABLE1")
-                .columns(
-                        SchemaBuilders.column("KEY", ColumnType.INT32).build(),
-                        SchemaBuilders.column("VAL", ColumnType.INT32).asNullable(true).build()
-                )
-                .withPrimaryKey("KEY")
-                .build();
-
-        Table tbl1 = CLUSTER_NODES.get(0).tables().createTable(schTbl1.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(schTbl1, tblCh)
-                        .changeReplicas(2)
-                        .changePartitions(10)
-        );
-
-        TableDefinition schTbl2 = SchemaBuilders.tableBuilder("PUBLIC", "BIG_TABLE2")
-                .columns(
-                        SchemaBuilders.column("KEY", ColumnType.INT32).build(),
-                        SchemaBuilders.column("VAL", ColumnType.INT32).asNullable(true).build()
-                )
-                .withPrimaryKey("KEY")
-                .build();
-
-        Table tbl2 = CLUSTER_NODES.get(0).tables().createTable(schTbl2.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(schTbl2, tblCh)
-                        .changeReplicas(2)
-                        .changePartitions(10)
-        );
+        sql("CREATE TABLE big_table1(key INT PRIMARY KEY, val INT)");
+        sql("CREATE TABLE big_table2(key INT PRIMARY KEY, val INT)");
 
         int key = 0;
 
-        RecordView<Tuple> recordView1 = tbl1.recordView();
-        RecordView<Tuple> recordView2 = tbl2.recordView();
         for (int i = 0; i < 5; i++) {
             for (int j = 0; j < ((i == 0) ? 1 : (1 << (i * 4 - 1))); j++) {
                 // Cache1 keys count: 1 of "0", 8 of "1", 128 of "2", 2048 of "3", 32768 of "4".
-                recordView1.insert(null, Tuple.create().set("KEY", key++).set("VAL", i));
+                sql("INSERT INTO big_table1 VALUES (?, ?)", key++, i);
 
                 // Cache2 keys count: 1 of "5", 128 of "3", 32768 of "1".
                 if ((i & 1) == 0) {
-                    recordView2.insert(null, Tuple.create().set("KEY", key++).set("VAL", 5 - i));
+                    sql("INSERT INTO big_table2 VALUES (?, ?)", key++, 5 - i);
                 }
             }
         }
@@ -262,21 +228,8 @@ public class ItSetOpTest extends AbstractBasicIntegrationTest {
         assertEquals(3, rows.size());
     }
 
-    private static Table createTable(String tableName) {
-        TableDefinition schTbl1 = SchemaBuilders.tableBuilder("PUBLIC", tableName)
-                .columns(
-                        SchemaBuilders.column("ID", ColumnType.INT32).build(),
-                        SchemaBuilders.column("NAME", ColumnType.string()).asNullable(true).build(),
-                        SchemaBuilders.column("SALARY", ColumnType.DOUBLE).asNullable(true).build()
-                )
-                .withPrimaryKey("ID")
-                .build();
-
-        return CLUSTER_NODES.get(0).tables().createTable(schTbl1.canonicalName(), tblCh ->
-                SchemaConfigurationConverter.convert(schTbl1, tblCh)
-                        .changeReplicas(2)
-                        .changePartitions(10)
-        );
+    private static void createTable(String tableName) {
+        sql("CREATE TABLE " + tableName + "(id INT PRIMARY KEY, name VARCHAR, salary DOUBLE)");
     }
 
     private <T> long countIf(Iterable<T> it, Predicate<T> pred) {
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/DecimalNativeType.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/DecimalNativeType.java
index cb642ba90f..45949c98e3 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/DecimalNativeType.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/DecimalNativeType.java
@@ -24,6 +24,12 @@ import org.apache.ignite.internal.tostring.S;
  * Decimal column type.
  */
 public class DecimalNativeType extends NativeType {
+    /** Default precision. */
+    public static final int DEFAULT_PRECISION = 19;
+
+    /** Default scale. */
+    public static final int DEFAULT_SCALE = 3;
+
     /** Precision. */
     private final int precision;
 
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java
index 6c7654f300..6308687c10 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java
@@ -20,8 +20,6 @@ package org.apache.ignite.internal.schema;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.BitSet;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.ColumnType.TemporalColumnType;
 import org.jetbrains.annotations.Contract;
 
 /**
@@ -148,7 +146,7 @@ public class NativeTypes {
      * @see #time(int)
      */
     public static NativeType time() {
-        return TemporalNativeType.time(ColumnType.TemporalColumnType.DEFAULT_TIME_PRECISION);
+        return TemporalNativeType.time(TemporalNativeType.DEFAULT_TIME_PRECISION);
     }
 
     /**
@@ -168,7 +166,7 @@ public class NativeTypes {
      * @see #datetime(int)
      */
     public static NativeType datetime() {
-        return TemporalNativeType.datetime(TemporalColumnType.DEFAULT_TIMESTAMP_PRECISION);
+        return TemporalNativeType.datetime(TemporalNativeType.DEFAULT_TIMESTAMP_PRECISION);
     }
 
     /**
@@ -188,7 +186,7 @@ public class NativeTypes {
      * @see #timestamp(int)
      */
     public static NativeType timestamp() {
-        return TemporalNativeType.timestamp(ColumnType.TemporalColumnType.DEFAULT_TIMESTAMP_PRECISION);
+        return TemporalNativeType.timestamp(TemporalNativeType.DEFAULT_TIMESTAMP_PRECISION);
     }
 
     /**
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaUtils.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaUtils.java
index d2f8ae8228..602a6be780 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaUtils.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaUtils.java
@@ -21,12 +21,10 @@ import java.util.Optional;
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.configuration.schemas.table.ColumnView;
 import org.apache.ignite.configuration.schemas.table.TableView;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.configuration.SchemaDescriptorConverter;
+import org.apache.ignite.internal.schema.configuration.ConfigurationToSchemaDescriptorConverter;
 import org.apache.ignite.internal.schema.mapping.ColumnMapper;
 import org.apache.ignite.internal.schema.mapping.ColumnMapping;
 import org.apache.ignite.lang.IgniteStringFormatter;
-import org.apache.ignite.schema.definition.TableDefinition;
 
 /**
  * Stateless schema utils that produces helper methods for schema preparation.
@@ -36,13 +34,11 @@ public class SchemaUtils {
      * Creates schema descriptor for the table with specified configuration.
      *
      * @param schemaVer Schema version.
-     * @param tblCfg    Table configuration.
+     * @param tableView Table configuration.
      * @return Schema descriptor.
      */
-    public static SchemaDescriptor prepareSchemaDescriptor(int schemaVer, TableView tblCfg) {
-        TableDefinition tableDef = SchemaConfigurationConverter.convert(tblCfg);
-
-        return SchemaDescriptorConverter.convert(schemaVer, tableDef);
+    public static SchemaDescriptor prepareSchemaDescriptor(int schemaVer, TableView tableView) {
+        return ConfigurationToSchemaDescriptorConverter.convert(schemaVer, tableView);
     }
 
     /**
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/TemporalNativeType.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/TemporalNativeType.java
index f401a7b67b..a71948e7c6 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/TemporalNativeType.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/TemporalNativeType.java
@@ -18,12 +18,32 @@
 package org.apache.ignite.internal.schema;
 
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.ColumnType.TemporalColumnType;
 
 /**
  * Temporal native type.
  */
 public class TemporalNativeType extends NativeType {
+    /**
+     * Default TIMESTAMP type precision: microseconds.
+     *
+     * <p>SQL99 part 2 section 6.1 syntax rule 30
+     */
+    public static final int DEFAULT_TIMESTAMP_PRECISION = 6;
+
+    /**
+     * Default TIME type precision: seconds.
+     *
+     * <p>SQL99 part 2 section 6.1 syntax rule 30
+     */
+    public static final int DEFAULT_TIME_PRECISION = 0;
+
+    /**
+     * Max TIME precision.
+     *
+     * <p>SQL99 part 2 section 6.1 syntax rule 32
+     */
+    public static final int MAX_TIME_PRECISION = 9;
+
     /**
      * Creates TIME type.
      *
@@ -72,7 +92,7 @@ public class TemporalNativeType extends NativeType {
     private TemporalNativeType(NativeTypeSpec typeSpec, int size, int precision) {
         super(typeSpec, size);
 
-        if (precision < 0 || precision > TemporalColumnType.MAX_TIME_PRECISION) {
+        if (precision < 0 || precision > MAX_TIME_PRECISION) {
             throw new IllegalArgumentException("Unsupported fractional seconds precision: " + precision);
         }
 
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ColumnTypeValidatorImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ColumnTypeValidatorImpl.java
index c6736cd977..0416b247f1 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ColumnTypeValidatorImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ColumnTypeValidatorImpl.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.schema.configuration;
 import java.util.Objects;
 import org.apache.ignite.configuration.schemas.table.ColumnTypeValidator;
 import org.apache.ignite.configuration.schemas.table.ColumnTypeView;
+import org.apache.ignite.configuration.schemas.table.ColumnView;
 import org.apache.ignite.configuration.validation.ValidationContext;
 import org.apache.ignite.configuration.validation.ValidationIssue;
 import org.apache.ignite.configuration.validation.Validator;
@@ -37,13 +38,9 @@ public class ColumnTypeValidatorImpl implements Validator<ColumnTypeValidator, C
         ColumnTypeView newType = ctx.getNewValue();
         ColumnTypeView oldType = ctx.getOldValue();
 
-        try {
-            SchemaConfigurationConverter.convert(newType);
-        } catch (IllegalArgumentException ex) {
-            ctx.addIssue(new ValidationIssue(ctx.currentKey(), ctx.currentKey() + ": " + ex.getMessage()));
-
-            return;
-        }
+        validateLength(ctx, newType);
+        validatePrecision(ctx, newType);
+        validateScale(ctx, newType);
 
         if (oldType == null) {
             return; // Nothing to do.
@@ -53,11 +50,81 @@ public class ColumnTypeValidatorImpl implements Validator<ColumnTypeValidator, C
                 || newType.precision() != oldType.precision()
                 || newType.scale() != oldType.scale()
                 || newType.length() != oldType.length()) {
-            ctx.addIssue(new ValidationIssue(ctx.currentKey(), "Unsupported column type change: " + ctx.currentKey()));
+            ColumnView columnView = ctx.getNewOwner();
+
+            assert columnView != null;
+
+            ctx.addIssue(new ValidationIssue(columnView.name(), "Column type can't be changed"));
         }
 
     }
 
+    private void validateLength(ValidationContext<ColumnTypeView> ctx, ColumnTypeView typeView) {
+        switch (typeView.type()) {
+            case "STRING":
+            case "BYTES":
+            case "BITMASK":
+                if (typeView.length() <= 0) {
+                    ColumnView columnView = ctx.getNewOwner();
+
+                    assert columnView != null;
+
+                    ctx.addIssue(new ValidationIssue(columnView.name(), "Length must be positive"));
+                }
+
+                break;
+            default:
+                // nothing to do
+                break;
+        }
+    }
+
+    private void validatePrecision(ValidationContext<ColumnTypeView> ctx, ColumnTypeView typeView) {
+        switch (typeView.type()) {
+            case "NUMBER":
+            case "DECIMAL":
+                if (typeView.precision() <= 0) {
+                    ColumnView columnView = ctx.getNewOwner();
+
+                    assert columnView != null;
+
+                    ctx.addIssue(new ValidationIssue(columnView.name(), "Precision must be positive"));
+                }
+
+                break;
+
+            case "TIME":
+            case "DATETIME":
+            case "TIMESTAMP":
+                if (typeView.precision() < 0 || typeView.precision() > 9) {
+                    ColumnView columnView = ctx.getNewOwner();
+
+                    assert columnView != null;
+
+                    ctx.addIssue(new ValidationIssue(columnView.name(), "Precision must be in range [0-9]"));
+                }
+
+                break;
+            default:
+                // nothing to do
+                break;
+        }
+    }
+
+    private void validateScale(ValidationContext<ColumnTypeView> ctx, ColumnTypeView typeView) {
+        if (!"DECIMAL".equals(typeView.type())) {
+            return;
+        }
+
+        if (typeView.precision() < typeView.scale()) {
+            ColumnView columnView = ctx.getNewOwner();
+
+            assert columnView != null;
+
+            ctx.addIssue(new ValidationIssue(columnView.name(), "Scale must be lower or equal to precision"));
+        }
+    }
+
     /** Private constructor. */
     private ColumnTypeValidatorImpl() {
     }
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ConfigurationToSchemaDescriptorConverter.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ConfigurationToSchemaDescriptorConverter.java
new file mode 100644
index 0000000000..20060dac54
--- /dev/null
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ConfigurationToSchemaDescriptorConverter.java
@@ -0,0 +1,191 @@
+/*
+ * 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.configuration;
+
+import static org.apache.ignite.internal.schema.configuration.ValueSerializationHelper.fromString;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.ignite.configuration.schemas.table.ColumnDefaultView;
+import org.apache.ignite.configuration.schemas.table.ColumnTypeView;
+import org.apache.ignite.configuration.schemas.table.ColumnView;
+import org.apache.ignite.configuration.schemas.table.ConstantValueDefaultView;
+import org.apache.ignite.configuration.schemas.table.FunctionCallDefaultView;
+import org.apache.ignite.configuration.schemas.table.NullValueDefaultView;
+import org.apache.ignite.configuration.schemas.table.TableView;
+import org.apache.ignite.internal.schema.Column;
+import org.apache.ignite.internal.schema.DefaultValueGenerator;
+import org.apache.ignite.internal.schema.DefaultValueProvider;
+import org.apache.ignite.internal.schema.NativeType;
+import org.apache.ignite.internal.schema.NativeTypes;
+import org.apache.ignite.internal.schema.SchemaDescriptor;
+import org.apache.ignite.internal.util.IgniteUtils;
+
+/**
+ * Utility class to convert table configuration view as well as all related objects to a {@link SchemaDescriptor} domain.
+ */
+public final class ConfigurationToSchemaDescriptorConverter {
+    private static final Map<String, NativeType> FIX_SIZED_TYPES;
+
+    static {
+        List<NativeType> types = IgniteUtils.collectStaticFields(NativeTypes.class, NativeType.class);
+
+        Map<String, NativeType> tmp = new HashMap<>(types.size(), 1.0f);
+
+        for (NativeType type : types) {
+            if (!type.spec().fixedLength()) {
+                continue;
+            }
+
+            tmp.put(type.spec().name(), type);
+        }
+
+        FIX_SIZED_TYPES = Map.copyOf(tmp);
+    }
+
+    /**
+     * Converts given type view to a {@link NativeType}.
+     *
+     * @param colTypeView View to convert.
+     * @return A {@link NativeType} object represented by given view.
+     */
+    public static NativeType convert(ColumnTypeView colTypeView) {
+        String typeName = colTypeView.type().toUpperCase();
+        NativeType res = FIX_SIZED_TYPES.get(typeName);
+
+        if (res != null) {
+            return res;
+        }
+
+        switch (typeName) {
+            case "BITMASK":
+                int bitmaskLen = colTypeView.length();
+
+                return NativeTypes.bitmaskOf(bitmaskLen);
+
+            case "STRING":
+                int strLen = colTypeView.length();
+
+                return NativeTypes.stringOf(strLen);
+
+            case "BYTES":
+                int blobLen = colTypeView.length();
+
+                return NativeTypes.blobOf(blobLen);
+
+            case "DECIMAL":
+                int prec = colTypeView.precision();
+                int scale = colTypeView.scale();
+
+                return NativeTypes.decimalOf(prec, scale);
+
+            case "NUMBER":
+                return NativeTypes.numberOf(colTypeView.precision());
+
+            case "TIME":
+                return NativeTypes.time(colTypeView.precision());
+
+            case "DATETIME":
+                return NativeTypes.datetime(colTypeView.precision());
+
+            case "TIMESTAMP":
+                return NativeTypes.timestamp(colTypeView.precision());
+
+            default:
+                throw new IllegalArgumentException("Unknown type " + typeName);
+        }
+    }
+
+    /**
+     * Converts given column view to a {@link Column}.
+     *
+     * @param columnOrder Number of the current column.
+     * @param columnView View to convert.
+     * @return A {@link Column} object represented by given view.
+     */
+    public static Column convert(int columnOrder, ColumnView columnView) {
+        NativeType type = convert(columnView.type());
+
+        ColumnDefaultView defaultValueView = columnView.defaultValueProvider();
+
+        DefaultValueProvider defaultValueProvider;
+
+        if (defaultValueView instanceof NullValueDefaultView) {
+            defaultValueProvider = DefaultValueProvider.constantProvider(null);
+        } else if (defaultValueView instanceof FunctionCallDefaultView) {
+            defaultValueProvider = DefaultValueProvider.forValueGenerator(
+                    DefaultValueGenerator.valueOf(
+                            ((FunctionCallDefaultView) defaultValueView).functionName()
+                    )
+            );
+        } else if (defaultValueView instanceof ConstantValueDefaultView) {
+            defaultValueProvider = DefaultValueProvider.constantProvider(
+                    fromString(((ConstantValueDefaultView) defaultValueView).defaultValue(), type)
+            );
+        } else {
+            throw new IllegalStateException("Unknown value supplier class " + defaultValueView.getClass().getName());
+        }
+
+        return new Column(columnOrder, columnView.name(), type, columnView.nullable(), defaultValueProvider);
+    }
+
+    /**
+     * Converts given table view to a {@link SchemaDescriptor}.
+     *
+     * @param schemaVer A version of given schema.
+     * @param tableView View to convert.
+     * @return A {@link SchemaDescriptor} object represented by given view.
+     */
+    public static SchemaDescriptor convert(int schemaVer, TableView tableView) {
+        Set<String> keyColumnsNames = Set.of(tableView.primaryKey().columns());
+
+        List<Column> keyCols = new ArrayList<>(keyColumnsNames.size());
+        List<Column> valCols = new ArrayList<>(tableView.columns().size() - keyColumnsNames.size());
+
+        int idx = 0;
+
+        for (String columnName : tableView.columns().namedListKeys()) {
+            ColumnView column = tableView.columns().get(columnName);
+
+            if (column == null) {
+                // columns was removed, so let's skip it
+                continue;
+            }
+
+            if (keyColumnsNames.contains(columnName)) {
+                keyCols.add(convert(idx, column));
+            } else {
+                valCols.add(convert(idx, column));
+            }
+
+            idx++;
+        }
+
+        return new SchemaDescriptor(
+                schemaVer,
+                keyCols.toArray(Column[]::new),
+                tableView.primaryKey().colocationColumns(),
+                valCols.toArray(Column[]::new)
+        );
+    }
+
+    private ConfigurationToSchemaDescriptorConverter() { }
+}
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/IndexValidatorImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/IndexValidatorImpl.java
index 7f454ded41..f13acfc609 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/IndexValidatorImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/IndexValidatorImpl.java
@@ -19,12 +19,15 @@ package org.apache.ignite.internal.schema.configuration;
 
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.getByInternalId;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 import java.util.UUID;
-import java.util.stream.Collectors;
 import org.apache.ignite.configuration.NamedListView;
+import org.apache.ignite.configuration.schemas.table.HashIndexView;
 import org.apache.ignite.configuration.schemas.table.IndexValidator;
+import org.apache.ignite.configuration.schemas.table.SortedIndexView;
 import org.apache.ignite.configuration.schemas.table.TableIndexView;
 import org.apache.ignite.configuration.schemas.table.TableView;
 import org.apache.ignite.configuration.schemas.table.TablesConfiguration;
@@ -32,11 +35,6 @@ import org.apache.ignite.configuration.schemas.table.TablesView;
 import org.apache.ignite.configuration.validation.ValidationContext;
 import org.apache.ignite.configuration.validation.ValidationIssue;
 import org.apache.ignite.configuration.validation.Validator;
-import org.apache.ignite.internal.schema.definition.SchemaValidationUtils;
-import org.apache.ignite.internal.schema.definition.TableDefinitionImpl;
-import org.apache.ignite.lang.IgniteInternalException;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.index.IndexDefinition;
 
 /**
  * Index configuration validator implementation.
@@ -55,7 +53,7 @@ public class IndexValidatorImpl implements Validator<IndexValidator, NamedListVi
 
         NamedListView<? extends TableView> tablesView = tablesConfig.tables();
 
-        for (String key : indexView.namedListKeys()) {
+        for (String key : newKeys(ctx.getOldValue(), ctx.getNewValue())) {
             TableIndexView idxView = indexView.get(key);
 
             UUID tableId = idxView.tableId();
@@ -64,28 +62,77 @@ public class IndexValidatorImpl implements Validator<IndexValidator, NamedListVi
 
             if (tableView == null) {
                 ctx.addIssue(new ValidationIssue(key, "Unable to create index [name=" + key + "]. Table not found."));
+
+                // no further validation required for current index
+                continue;
             }
 
-            IndexDefinition index = SchemaConfigurationConverter.convert(idxView);
+            List<String> colocationColumns;
+            if (tableView.primaryKey() != null) {
+                colocationColumns = List.of(tableView.primaryKey().colocationColumns());
+            } else {
+                colocationColumns = List.of();
+            }
 
-            TableDefinitionImpl tbl = SchemaConfigurationConverter.convert(tableView);
+            validate(ctx, idxView, tableView.columns().namedListKeys(), colocationColumns);
+        }
+    }
 
-            Set<String> tableColumns = tbl.columns().stream().map(ColumnDefinition::name).collect(Collectors.toSet());
+    private void validate(
+            ValidationContext<?> ctx,
+            TableIndexView indexView,
+            Collection<String> tableColumns,
+            Collection<String> collocationColumns
+    ) {
+        List<String> indexedColumns;
+        if (indexView instanceof HashIndexView) {
+            var index0 = (HashIndexView) indexView;
+
+            // we need modifiable list
+            indexedColumns = new ArrayList<>(Arrays.asList(index0.columnNames()));
+        } else if (indexView instanceof SortedIndexView) {
+            var index0 = (SortedIndexView) indexView;
+
+            // we need modifiable list
+            indexedColumns = new ArrayList<>(index0.columns().namedListKeys());
+        } else {
+            ctx.addIssue(new ValidationIssue(indexView.name(), "Index type is not supported [type=" + indexView.type() + "]"));
+
+            // no further validation required
+            return;
+        }
 
-            List<String> tableColocationColumns = tbl.colocationColumns();
+        if (indexedColumns.isEmpty()) {
+            ctx.addIssue(new ValidationIssue(indexView.name(), "Index must include at least one column"));
 
-            try {
-                SchemaValidationUtils.validateIndexes(index, tableColumns, tableColocationColumns);
-            } catch (IllegalStateException e) {
-                ctx.addIssue(new ValidationIssue(key, e.getMessage()));
-            }
+            // no further validation required
+            return;
+        }
 
-            try {
-                SchemaValidationUtils.validateColumns(idxView, tableColumns);
-            } catch (IgniteInternalException e) {
-                ctx.addIssue(new ValidationIssue(key, e.getMessage()));
+        // need check this first because later indexedColumns will be truncated
+        if (indexView.uniq()) {
+            if (collocationColumns.isEmpty()) {
+                ctx.addIssue(new ValidationIssue(indexView.name(), "Unique index is not supported for tables without primary key"));
+            } else if (!indexedColumns.containsAll(collocationColumns)) {
+                ctx.addIssue(new ValidationIssue(indexView.name(), "Unique index must include all colocation columns"));
             }
         }
+
+        indexedColumns.removeAll(tableColumns);
+
+        if (!indexedColumns.isEmpty()) {
+            ctx.addIssue(new ValidationIssue(indexView.name(), "Columns don't exist [columns=" + indexedColumns + "]"));
+        }
+    }
+
+    private List<String> newKeys(NamedListView<?> before, NamedListView<?> after) {
+        List<String> result = new ArrayList<>(after.namedListKeys());
+
+        if (before != null) {
+            result.removeAll(before.namedListKeys());
+        }
+
+        return result;
     }
 
     /** Private constructor. */
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverter.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverter.java
deleted file mode 100644
index 158958bbf2..0000000000
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverter.java
+++ /dev/null
@@ -1,225 +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.schema.configuration;
-
-import static org.apache.ignite.internal.schema.NativeTypes.DOUBLE;
-import static org.apache.ignite.internal.schema.NativeTypes.FLOAT;
-import static org.apache.ignite.internal.schema.NativeTypes.INT16;
-import static org.apache.ignite.internal.schema.NativeTypes.INT32;
-import static org.apache.ignite.internal.schema.NativeTypes.INT64;
-import static org.apache.ignite.internal.schema.NativeTypes.INT8;
-import static org.apache.ignite.internal.schema.NativeTypes.UUID;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Supplier;
-import org.apache.ignite.internal.schema.Column;
-import org.apache.ignite.internal.schema.DefaultValueGenerator;
-import org.apache.ignite.internal.schema.DefaultValueProvider;
-import org.apache.ignite.internal.schema.InvalidTypeException;
-import org.apache.ignite.internal.schema.NativeType;
-import org.apache.ignite.internal.schema.NativeTypes;
-import org.apache.ignite.internal.schema.SchemaDescriptor;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.ConstantValue;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.DefaultValueType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.FunctionCall;
-import org.apache.ignite.schema.definition.TableDefinition;
-
-/**
- * Build SchemaDescriptor from Table internal configuration.
- */
-public class SchemaDescriptorConverter {
-    /**
-     * Convert ColumnType to NativeType.
-     *
-     * @param colType ColumnType.
-     * @return NativeType.
-     */
-    public static NativeType convert(ColumnType colType) {
-        assert colType != null;
-
-        ColumnType.ColumnTypeSpec type = colType.typeSpec();
-
-        switch (type) {
-            case INT8:
-                return INT8;
-
-            case INT16:
-                return INT16;
-
-            case INT32:
-                return INT32;
-
-            case INT64:
-                return INT64;
-
-            case FLOAT:
-                return FLOAT;
-
-            case DOUBLE:
-                return DOUBLE;
-
-            case DECIMAL: {
-                ColumnType.DecimalColumnType numType = (ColumnType.DecimalColumnType) colType;
-
-                return NativeTypes.decimalOf(numType.precision(), numType.scale());
-            }
-            case UUID:
-                return UUID;
-
-            case BITMASK:
-                return NativeTypes.bitmaskOf(((ColumnType.VarLenColumnType) colType).length());
-
-            case STRING: {
-                int strLen = ((ColumnType.VarLenColumnType) colType).length();
-
-                if (strLen == 0) {
-                    strLen = Integer.MAX_VALUE;
-                }
-
-                return NativeTypes.stringOf(strLen);
-            }
-            case BLOB: {
-                int blobLen = ((ColumnType.VarLenColumnType) colType).length();
-
-                if (blobLen == 0) {
-                    blobLen = Integer.MAX_VALUE;
-                }
-
-                return NativeTypes.blobOf(blobLen);
-            }
-            case DATE:
-                return NativeTypes.DATE;
-            case TIME: {
-                ColumnType.TemporalColumnType temporalType = (ColumnType.TemporalColumnType) colType;
-
-                return NativeTypes.time(temporalType.precision());
-            }
-            case DATETIME: {
-                ColumnType.TemporalColumnType temporalType = (ColumnType.TemporalColumnType) colType;
-
-                return NativeTypes.datetime(temporalType.precision());
-            }
-            case TIMESTAMP: {
-                ColumnType.TemporalColumnType temporalType = (ColumnType.TemporalColumnType) colType;
-
-                return NativeTypes.timestamp(temporalType.precision());
-            }
-
-            case NUMBER: {
-                ColumnType.NumberColumnType numberType = (ColumnType.NumberColumnType) colType;
-
-                return NativeTypes.numberOf(numberType.precision());
-            }
-            default:
-                throw new InvalidTypeException("Unexpected type " + type);
-        }
-    }
-
-    /**
-     * Creates a column for given column definition.
-     *
-     * @param colCfg Column definition.
-     * @return Internal Column.
-     */
-    public static Column convert(int columnOrder, ColumnDefinition colCfg) {
-        NativeType type = convert(colCfg.type());
-
-        DefaultValueType defaultValueType;
-        if (colCfg.defaultValueDefinition() == null) {
-            defaultValueType = DefaultValueType.NULL;
-        } else {
-            defaultValueType = colCfg.defaultValueDefinition().type();
-        }
-
-        switch (defaultValueType) {
-            case NULL:
-                return new Column(columnOrder, colCfg.name(), type, colCfg.nullable());
-            case CONSTANT:
-                ConstantValue constantValue = colCfg.defaultValueDefinition();
-
-                return new Column(columnOrder, colCfg.name(), type, colCfg.nullable(),
-                        DefaultValueProvider.constantProvider(constantValue.value()));
-            case FUNCTION_CALL:
-                FunctionCall functionCall = colCfg.defaultValueDefinition();
-
-                return new Column(columnOrder, colCfg.name(), type, colCfg.nullable(),
-                        DefaultValueProvider.forValueGenerator(DefaultValueGenerator.valueOf(functionCall.functionName())));
-            default:
-                throw new IllegalStateException("Unknown type " + colCfg.defaultValueDefinition().type());
-        }
-    }
-
-    /**
-     * Build schema descriptor by table schema.
-     *
-     * @param schemaVer Schema version.
-     * @param tblCfg    Table schema.
-     * @return SchemaDescriptor.
-     */
-    public static SchemaDescriptor convert(int schemaVer, TableDefinition tblCfg) {
-        Set<String> keyColumnsNames = tblCfg.keyColumns();
-
-        List<Column> keyCols = new ArrayList<>(keyColumnsNames.size());
-        List<Column> valCols = new ArrayList<>(tblCfg.columns().size() - keyColumnsNames.size());
-
-        int idx = 0;
-
-        for (ColumnDefinition col : tblCfg.columns()) {
-            if (keyColumnsNames.contains(col.name())) {
-                keyCols.add(convert(idx, col));
-            } else {
-                valCols.add(convert(idx, col));
-            }
-
-            idx++;
-        }
-
-        return new SchemaDescriptor(
-                schemaVer,
-                keyCols.toArray(Column[]::new),
-                tblCfg.colocationColumns().toArray(String[]::new),
-                valCols.toArray(Column[]::new));
-    }
-
-    /**
-     * Constant value supplier.
-     */
-    private static class ConstantSupplier implements Supplier<Object> {
-        /** Value. */
-        private final Object val;
-
-        /**
-         * Constructor.
-         *
-         * @param val Value.
-         */
-        ConstantSupplier(Object val) {
-            this.val = val;
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public Object get() {
-            return val;
-        }
-    }
-}
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java
index df5531b221..95a09824a4 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/TableValidatorImpl.java
@@ -17,13 +17,20 @@
 
 package org.apache.ignite.internal.schema.configuration;
 
+import static org.apache.ignite.internal.util.ArrayUtils.nullOrEmpty;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.configuration.schemas.table.TableValidator;
 import org.apache.ignite.configuration.schemas.table.TableView;
 import org.apache.ignite.configuration.validation.ValidationContext;
 import org.apache.ignite.configuration.validation.ValidationIssue;
 import org.apache.ignite.configuration.validation.Validator;
-import org.apache.ignite.internal.schema.definition.TableDefinitionImpl;
 
 /**
  * Table schema configuration validator implementation.
@@ -37,19 +44,69 @@ public class TableValidatorImpl implements Validator<TableValidator, NamedListVi
     public void validate(TableValidator annotation, ValidationContext<NamedListView<TableView>> ctx) {
         NamedListView<TableView> newTables = ctx.getNewValue();
 
-        for (String tableName : newTables.namedListKeys()) {
+        for (String tableName : newKeys(ctx.getOldValue(), ctx.getNewValue())) {
             TableView newTable = newTables.get(tableName);
 
-            try {
-                TableDefinitionImpl tbl = SchemaConfigurationConverter.convert(newTable);
+            if (newTable.columns() == null || newTable.columns().size() == 0) {
+                ctx.addIssue(new ValidationIssue(newTable.name(), "Table should include at least one column"));
+
+                // no further validation required
+                return;
+            }
+
+            Set<String> columnsDups = findDuplicates(newTable.columns().namedListKeys());
+
+            if (!columnsDups.isEmpty()) {
+                ctx.addIssue(new ValidationIssue(newTable.name(),
+                        "Some columns are specified more than once [duplicates=" + new HashSet<>(columnsDups) + "]"));
+            }
+
+            Set<String> columns = new HashSet<>(newTable.columns().namedListKeys());
+
+            if (newTable.primaryKey() == null || nullOrEmpty(newTable.primaryKey().columns())) {
+                ctx.addIssue(new ValidationIssue(newTable.name(), "Table without primary key is not supported"));
+
+                // no further validation required
+                return;
+            }
+
+            List<String> pkColumns = Arrays.asList(newTable.primaryKey().columns());
+
+            if (!columns.containsAll(pkColumns)) {
+                Set<String> missingColumns = new HashSet<>(pkColumns);
+
+                missingColumns.removeAll(columns);
+
+                ctx.addIssue(new ValidationIssue(newTable.name(), "Columns don't exists [columns=" + missingColumns + "]"));
+            }
+
+            Set<String> pkDups = findDuplicates(pkColumns);
+            if (!pkDups.isEmpty()) {
+                ctx.addIssue(new ValidationIssue(newTable.name(),
+                        "Primary key contains duplicated columns [duplicates=" + pkDups + "]"));
+            }
+
+            if (nullOrEmpty(newTable.primaryKey().colocationColumns())) {
+                ctx.addIssue(new ValidationIssue(newTable.name(), "Colocation columns must be specified"));
 
-                assert !tbl.keyColumns().isEmpty();
-                assert !tbl.colocationColumns().isEmpty();
-            } catch (IllegalArgumentException e) {
-                ctx.addIssue(new ValidationIssue(
-                        ctx.currentKey(),
-                        "Validator works success by key " + ctx.currentKey() + ". Found "
-                                + newTable.columns().size() + " columns"));
+                // no further validation required
+                return;
+            }
+
+            Set<String> outstandingColumns = new HashSet<>(Arrays.asList(newTable.primaryKey().colocationColumns()));
+
+            outstandingColumns.removeAll(Arrays.asList(newTable.primaryKey().columns()));
+
+            if (!outstandingColumns.isEmpty()) {
+                ctx.addIssue(new ValidationIssue(newTable.name(),
+                        "Colocation columns must be subset of primary key [outstandingColumns=" + outstandingColumns + "]"));
+            }
+
+            Set<String> colocationDups = findDuplicates(Arrays.asList(newTable.primaryKey().colocationColumns()));
+
+            if (!colocationDups.isEmpty()) {
+                ctx.addIssue(new ValidationIssue(newTable.name(),
+                        "Colocation columns contains duplicates [duplicates=" + colocationDups + "]"));
             }
         }
     }
@@ -57,4 +114,27 @@ public class TableValidatorImpl implements Validator<TableValidator, NamedListVi
     /** Private constructor. */
     private TableValidatorImpl() {
     }
+
+    private List<String> newKeys(NamedListView<?> before, NamedListView<?> after) {
+        List<String> result = new ArrayList<>(after.namedListKeys());
+
+        if (before != null) {
+            result.removeAll(before.namedListKeys());
+        }
+
+        return result;
+    }
+
+    private Set<String> findDuplicates(Collection<String> collection) {
+        Set<String> used = new HashSet<>();
+        Set<String> result = new HashSet<>();
+
+        for (String element : collection) {
+            if (!used.add(element)) {
+                result.add(element);
+            }
+        }
+
+        return result;
+    }
 }
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ValueSerializationHelper.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ValueSerializationHelper.java
new file mode 100644
index 0000000000..5ebcf5e94a
--- /dev/null
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/ValueSerializationHelper.java
@@ -0,0 +1,129 @@
+/*
+ * 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.configuration;
+
+import static java.math.RoundingMode.HALF_UP;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.BitSet;
+import java.util.Objects;
+import java.util.UUID;
+import org.apache.ignite.internal.schema.DecimalNativeType;
+import org.apache.ignite.internal.schema.NativeType;
+import org.apache.ignite.internal.util.IgniteUtils;
+
+/**
+ * Utility class to convert object to and from human readable string representation.
+ */
+public final class ValueSerializationHelper {
+    /**
+     * Converts value to a string representation.
+     *
+     * @param defaultValue Value to convert.
+     * @param type Type of the value.
+     * @return String representation of given value.
+     * @throws NullPointerException If given value or type is null.
+     */
+    public static String toString(Object defaultValue, NativeType type) {
+        Objects.requireNonNull(defaultValue, "defaultValue");
+        Objects.requireNonNull(type, "type");
+
+        switch (type.spec()) {
+            case INT8:
+            case INT16:
+            case INT32:
+            case INT64:
+            case FLOAT:
+            case DOUBLE:
+            case DECIMAL:
+            case DATE:
+            case TIME:
+            case DATETIME:
+            case TIMESTAMP:
+            case NUMBER:
+            case STRING:
+            case UUID:
+                return defaultValue.toString();
+            case BYTES:
+                return IgniteUtils.toHexString((byte[]) defaultValue);
+            case BITMASK:
+                return IgniteUtils.toHexString(((BitSet) defaultValue).toByteArray());
+            default:
+                throw new IllegalStateException("Unknown type [type=" + type + ']');
+        }
+    }
+
+    /**
+     * Converts value from a string representation.
+     *
+     * @param defaultValue String representation of a value.
+     * @param type Type of the value.
+     * @return Restored value.
+     * @throws NullPointerException If given value or type is null.
+     */
+    public static Object fromString(String defaultValue, NativeType type) {
+        Objects.requireNonNull(defaultValue, "defaultValue");
+        Objects.requireNonNull(type, "type");
+
+        switch (type.spec()) {
+            case INT8:
+                return Byte.parseByte(defaultValue);
+            case INT16:
+                return Short.parseShort(defaultValue);
+            case INT32:
+                return Integer.parseInt(defaultValue);
+            case INT64:
+                return Long.parseLong(defaultValue);
+            case FLOAT:
+                return Float.parseFloat(defaultValue);
+            case DOUBLE:
+                return Double.parseDouble(defaultValue);
+            case DECIMAL:
+                assert type instanceof DecimalNativeType;
+
+                return new BigDecimal(defaultValue).setScale(((DecimalNativeType) type).scale(), HALF_UP);
+            case DATE:
+                return LocalDate.parse(defaultValue);
+            case TIME:
+                return LocalTime.parse(defaultValue);
+            case DATETIME:
+                return LocalDateTime.parse(defaultValue);
+            case TIMESTAMP:
+                return Instant.parse(defaultValue);
+            case NUMBER:
+                return new BigInteger(defaultValue);
+            case STRING:
+                return defaultValue;
+            case UUID:
+                return UUID.fromString(defaultValue);
+            case BYTES:
+                return IgniteUtils.fromHexString(defaultValue);
+            case BITMASK:
+                return BitSet.valueOf(IgniteUtils.fromHexString(defaultValue));
+            default:
+                throw new IllegalStateException("Unknown type [type=" + type + ']');
+        }
+    }
+
+    private ValueSerializationHelper() { }
+}
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/SchemaValidationUtils.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/SchemaValidationUtils.java
deleted file mode 100644
index e88329cb07..0000000000
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/SchemaValidationUtils.java
+++ /dev/null
@@ -1,116 +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.schema.definition;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.apache.ignite.configuration.schemas.table.HashIndexView;
-import org.apache.ignite.configuration.schemas.table.SortedIndexView;
-import org.apache.ignite.configuration.schemas.table.TableIndexView;
-import org.apache.ignite.internal.util.CollectionUtils;
-import org.apache.ignite.lang.ErrorGroups;
-import org.apache.ignite.lang.ErrorGroups.Table;
-import org.apache.ignite.lang.IgniteInternalException;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.index.ColumnarIndexDefinition;
-import org.apache.ignite.schema.definition.index.IndexColumnDefinition;
-import org.apache.ignite.schema.definition.index.IndexDefinition;
-
-/**
- * Schema validation methods.
- */
-public class SchemaValidationUtils {
-    /**
-     * Validate primary key.
-     *
-     * @param pkColNames Primary key columns.
-     * @param cols       Table columns.
-     */
-    public static void validatePrimaryKey(Set<String> pkColNames, final Map<String, ColumnDefinition> cols) {
-        pkColNames.stream()
-                .filter(pkCol -> cols.get(pkCol).nullable())
-                .findAny()
-                .ifPresent((pkCol) -> {
-                    throw new IllegalStateException("Primary key cannot contain nullable column [col=" + pkCol + "].");
-                });
-    }
-
-    /**
-     * Validate indexes.
-     *
-     * @param index Table index.
-     * @param colNames Table column names.
-     * @param colocationColNames Colocation columns names.
-     */
-    public static void validateIndexes(
-            IndexDefinition index,
-            Collection<String> colNames,
-            List<String> colocationColNames) {
-        assert index instanceof ColumnarIndexDefinition : "Only columnar indices are supported.";
-        // Note: E.g. functional index is not columnar index as it index an expression result only.
-
-        ColumnarIndexDefinition idx0 = (ColumnarIndexDefinition) index;
-
-        if (!idx0.columns().stream().map(IndexColumnDefinition::name).allMatch(colNames::contains)) {
-            throw new IllegalStateException("Index column must exist in the schema.");
-        }
-
-        if (idx0.unique() && !(idx0.columns().stream().map(IndexColumnDefinition::name).allMatch(colocationColNames::contains))) {
-            throw new IllegalStateException("Unique index must contains all colocation columns.");
-        }
-    }
-
-    /**
-     * Validate index enlisted columns.
-     *
-     * @param indexView Index info.
-     * @param tableColumns Table column names.
-     */
-    public static void validateColumns(TableIndexView indexView, Set<String> tableColumns) {
-        if (indexView instanceof SortedIndexView) {
-            var sortedIndexView = (SortedIndexView) indexView;
-
-            validateColumns(sortedIndexView.columns().namedListKeys(), tableColumns);
-        } else if (indexView instanceof HashIndexView) {
-            validateColumns(Arrays.asList(((HashIndexView) indexView).columnNames()), tableColumns);
-        } else {
-            throw new AssertionError("Unknown index type [type=" + (indexView != null ? indexView.getClass() : null) + ']');
-        }
-    }
-
-    private static void validateColumns(Iterable<String> indexedColumns, Set<String> tableColumns) {
-        if (CollectionUtils.nullOrEmpty(indexedColumns)) {
-            throw new IgniteInternalException(
-                    ErrorGroups.Index.INVALID_INDEX_DEFINITION_ERR,
-                    "At least one column should be specified by index definition"
-            );
-        }
-
-        for (var columnName : indexedColumns) {
-            if (!tableColumns.contains(columnName)) {
-                throw new IgniteInternalException(
-                        Table.COLUMN_NOT_FOUND_ERR,
-                        "Column not found [name=" + columnName + ']'
-                );
-            }
-        }
-    }
-}
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/row/RowAssembler.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/row/RowAssembler.java
index 0330cbd7fe..06a771672d 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/row/RowAssembler.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/row/RowAssembler.java
@@ -546,7 +546,7 @@ public class RowAssembler {
      * @throws SchemaMismatchException If a value doesn't match the current column type.
      */
     public RowAssembler appendString(String val) throws SchemaMismatchException {
-        checkType(NativeTypes.STRING);
+        checkType(NativeTypeSpec.STRING);
 
         try {
             final int written = buf.putString(curOff, val, encoder());
@@ -571,7 +571,7 @@ public class RowAssembler {
      * @throws SchemaMismatchException If a value doesn't match the current column type.
      */
     public RowAssembler appendBytes(byte[] val) throws SchemaMismatchException {
-        checkType(NativeTypes.BYTES);
+        checkType(NativeTypeSpec.BYTES);
 
         buf.putBytes(curOff, val);
 
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/NativeTypeTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/NativeTypeTest.java
index 55294c0006..acd3ef4fc4 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/NativeTypeTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/NativeTypeTest.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.schema;
 
 import static org.apache.ignite.internal.schema.NativeTypes.BYTES;
 import static org.apache.ignite.internal.schema.NativeTypes.DATE;
-import static org.apache.ignite.internal.schema.NativeTypes.DOUBLE;
 import static org.apache.ignite.internal.schema.NativeTypes.FLOAT;
 import static org.apache.ignite.internal.schema.NativeTypes.INT16;
 import static org.apache.ignite.internal.schema.NativeTypes.INT32;
@@ -27,20 +26,13 @@ import static org.apache.ignite.internal.schema.NativeTypes.INT64;
 import static org.apache.ignite.internal.schema.NativeTypes.INT8;
 import static org.apache.ignite.internal.schema.NativeTypes.STRING;
 import static org.apache.ignite.internal.schema.NativeTypes.UUID;
-import static org.apache.ignite.internal.schema.NativeTypes.bitmaskOf;
-import static org.apache.ignite.internal.schema.NativeTypes.blobOf;
 import static org.apache.ignite.internal.schema.NativeTypes.datetime;
-import static org.apache.ignite.internal.schema.NativeTypes.decimalOf;
-import static org.apache.ignite.internal.schema.NativeTypes.numberOf;
-import static org.apache.ignite.internal.schema.NativeTypes.stringOf;
 import static org.apache.ignite.internal.schema.NativeTypes.time;
 import static org.apache.ignite.internal.schema.NativeTypes.timestamp;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.ignite.internal.schema.configuration.SchemaDescriptorConverter;
-import org.apache.ignite.schema.definition.ColumnType;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -156,43 +148,4 @@ public class NativeTypeTest {
     public void compareVarlenTypesByDesc() {
         assertTrue(BYTES.compareTo(STRING) < 0);
     }
-
-    /**
-     * CreateNativeTypeFromColumnType.
-     * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
-     */
-    @Test
-    public void createNativeTypeFromColumnType() {
-        assertEquals(INT8, from(ColumnType.INT8));
-        assertEquals(INT16, from(ColumnType.INT16));
-        assertEquals(INT32, from(ColumnType.INT32));
-        assertEquals(INT64, from(ColumnType.INT64));
-        assertEquals(FLOAT, from(ColumnType.FLOAT));
-        assertEquals(DOUBLE, from(ColumnType.DOUBLE));
-        assertEquals(DATE, from(ColumnType.DATE));
-        assertEquals(BYTES, from(ColumnType.blob()));
-        assertEquals(STRING, from(ColumnType.string()));
-
-        assertEquals(time(), from(ColumnType.time(ColumnType.TemporalColumnType.DEFAULT_TIME_PRECISION)));
-        assertEquals(datetime(), from(ColumnType.datetime(ColumnType.TemporalColumnType.DEFAULT_TIMESTAMP_PRECISION)));
-        assertEquals(timestamp(), from(ColumnType.timestamp(ColumnType.TemporalColumnType.DEFAULT_TIMESTAMP_PRECISION)));
-
-        for (int i = 1; i < 800; i += 100) {
-            assertEquals(blobOf(i), from(ColumnType.blobOf(i)));
-            assertEquals(stringOf(i), from(ColumnType.stringOf(i)));
-            assertEquals(bitmaskOf(i), from(ColumnType.bitmaskOf(i)));
-            assertEquals(numberOf(i), from(ColumnType.numberOf(i)));
-            assertEquals(decimalOf(i, i), from(ColumnType.decimalOf(i, i)));
-        }
-
-        for (int i = 0; i <= 9; i++) {
-            assertEquals(time(i), from(ColumnType.time(i)));
-            assertEquals(datetime(i), from(ColumnType.datetime(i)));
-            assertEquals(timestamp(i), from(ColumnType.timestamp(i)));
-        }
-    }
-
-    private NativeType from(ColumnType colType) {
-        return SchemaDescriptorConverter.convert(colType);
-    }
 }
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java
index 64a9748f34..0d9c3f57c9 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaConfigurationTest.java
@@ -27,8 +27,8 @@ import org.apache.ignite.internal.schema.testutils.builder.HashIndexDefinitionBu
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.builder.SortedIndexDefinitionBuilder;
 import org.apache.ignite.internal.schema.testutils.builder.TableDefinitionBuilder;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.SchemaObject;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.SchemaObject;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/TemporalTypesTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/TemporalTypesTest.java
index bf61ab6b66..2aa432d4a4 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/TemporalTypesTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/TemporalTypesTest.java
@@ -24,7 +24,7 @@ import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
 import org.apache.ignite.internal.schema.row.TemporalTypesHelper;
-import org.apache.ignite.schema.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/ColumnDefinitionBuilderTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/ColumnDefinitionBuilderTest.java
index aed110db1f..c679876796 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/ColumnDefinitionBuilderTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/ColumnDefinitionBuilderTest.java
@@ -23,10 +23,10 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import java.time.LocalDate;
 import org.apache.ignite.internal.schema.testutils.builder.ColumnDefinitionBuilder;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.ConstantValue;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.DefaultValueType;
+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.DefaultValueType;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/HashIndexDefinitionBuilderTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/HashIndexDefinitionBuilderTest.java
index 2a2174b156..78c95e1815 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/HashIndexDefinitionBuilderTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/HashIndexDefinitionBuilderTest.java
@@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import java.util.Collections;
 import org.apache.ignite.internal.schema.testutils.builder.HashIndexDefinitionBuilder;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.index.HashIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.HashIndexDefinition;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java
index 66d83e4825..e716d6ffef 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/PrimaryKeyDefinitionDefinitionBuilderTest.java
@@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.List;
 import org.apache.ignite.internal.schema.testutils.builder.PrimaryKeyDefinitionBuilder;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.PrimaryKeyDefinition;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/SortedIndexDefinitionBuilderTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/SortedIndexDefinitionBuilderTest.java
index 079257231c..46712c3cd2 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/SortedIndexDefinitionBuilderTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/SortedIndexDefinitionBuilderTest.java
@@ -22,8 +22,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.builder.SortedIndexDefinitionBuilder;
-import org.apache.ignite.schema.definition.index.SortOrder;
-import org.apache.ignite.schema.definition.index.SortedIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortOrder;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexDefinition;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/TableDefinitionBuilderTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/TableDefinitionBuilderTest.java
index ed720e1bca..c5f0688d22 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/TableDefinitionBuilderTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/builder/TableDefinitionBuilderTest.java
@@ -21,8 +21,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.builder.TableDefinitionBuilder;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractSchemaConverterTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractSchemaConverterTest.java
index 99a60b0b0f..adc0a00ae8 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractSchemaConverterTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractSchemaConverterTest.java
@@ -35,45 +35,47 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+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.NativeTypes;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType.DecimalColumnType;
 import org.apache.ignite.internal.util.ArrayUtils;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.ColumnType.ColumnTypeSpec;
-import org.apache.ignite.schema.definition.ColumnType.DecimalColumnType;
 
 /**
  * Abstract class for schema converter tests.
  */
 public class AbstractSchemaConverterTest {
-    protected static final Map<ColumnTypeSpec, List<Object>> DEFAULT_VALUES_TO_TEST;
+    protected static final Map<NativeTypeSpec, List<Object>> DEFAULT_VALUES_TO_TEST;
 
     static {
-        var tmp = new HashMap<ColumnTypeSpec, List<Object>>();
+        var tmp = new HashMap<NativeTypeSpec, List<Object>>();
 
-        tmp.put(ColumnTypeSpec.INT8, Arrays.asList(null, Byte.MIN_VALUE, Byte.MAX_VALUE, (byte) 14));
-        tmp.put(ColumnTypeSpec.INT16, Arrays.asList(null, Short.MIN_VALUE, Short.MAX_VALUE, (short) 14));
-        tmp.put(ColumnTypeSpec.INT32, Arrays.asList(null, Integer.MIN_VALUE, Integer.MAX_VALUE, 14));
-        tmp.put(ColumnTypeSpec.INT64, Arrays.asList(null, Long.MIN_VALUE, Long.MAX_VALUE, 14L));
-        tmp.put(ColumnTypeSpec.FLOAT, Arrays.asList(null, Float.MIN_VALUE, Float.MAX_VALUE, Float.NaN,
+        tmp.put(NativeTypeSpec.INT8, Arrays.asList(null, Byte.MIN_VALUE, Byte.MAX_VALUE, (byte) 14));
+        tmp.put(NativeTypeSpec.INT16, Arrays.asList(null, Short.MIN_VALUE, Short.MAX_VALUE, (short) 14));
+        tmp.put(NativeTypeSpec.INT32, Arrays.asList(null, Integer.MIN_VALUE, Integer.MAX_VALUE, 14));
+        tmp.put(NativeTypeSpec.INT64, Arrays.asList(null, Long.MIN_VALUE, Long.MAX_VALUE, 14L));
+        tmp.put(NativeTypeSpec.FLOAT, Arrays.asList(null, Float.MIN_VALUE, Float.MAX_VALUE, Float.NaN,
                 Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY, 14.14f));
-        tmp.put(ColumnTypeSpec.DOUBLE, Arrays.asList(null, Double.MIN_VALUE, Double.MAX_VALUE, Double.NaN,
+        tmp.put(NativeTypeSpec.DOUBLE, Arrays.asList(null, Double.MIN_VALUE, Double.MAX_VALUE, Double.NaN,
                 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 14.14));
-        tmp.put(ColumnTypeSpec.DECIMAL, Arrays.asList(null, BigDecimal.ONE, BigDecimal.ZERO, BigDecimal.valueOf(Long.MIN_VALUE),
+        tmp.put(NativeTypeSpec.DECIMAL, Arrays.asList(null, BigDecimal.ONE, BigDecimal.ZERO, BigDecimal.valueOf(Long.MIN_VALUE),
                 BigDecimal.valueOf(Long.MAX_VALUE), new BigDecimal("10000000000000000000000000000000000000")));
-        tmp.put(ColumnTypeSpec.DATE, Arrays.asList(null, LocalDate.MIN, LocalDate.MAX, LocalDate.EPOCH, LocalDate.now()));
-        tmp.put(ColumnTypeSpec.TIME, Arrays.asList(null, LocalTime.MIN, LocalTime.MAX, LocalTime.MIDNIGHT,
+        tmp.put(NativeTypeSpec.DATE, Arrays.asList(null, LocalDate.MIN, LocalDate.MAX, LocalDate.EPOCH, LocalDate.now()));
+        tmp.put(NativeTypeSpec.TIME, Arrays.asList(null, LocalTime.MIN, LocalTime.MAX, LocalTime.MIDNIGHT,
                 LocalTime.NOON, LocalTime.now()));
-        tmp.put(ColumnTypeSpec.DATETIME, Arrays.asList(null, LocalDateTime.MIN, LocalDateTime.MAX, LocalDateTime.now()));
-        tmp.put(ColumnTypeSpec.TIMESTAMP, Arrays.asList(null, Instant.MIN, Instant.MAX, Instant.EPOCH, Instant.now()));
-        tmp.put(ColumnTypeSpec.UUID, Arrays.asList(null, UUID.randomUUID()));
-        tmp.put(ColumnTypeSpec.BITMASK, Arrays.asList(null, fromBinString(""), fromBinString("1"),
+        tmp.put(NativeTypeSpec.DATETIME, Arrays.asList(null, LocalDateTime.MIN, LocalDateTime.MAX, LocalDateTime.now()));
+        tmp.put(NativeTypeSpec.TIMESTAMP, Arrays.asList(null, Instant.MIN, Instant.MAX, Instant.EPOCH, Instant.now()));
+        tmp.put(NativeTypeSpec.UUID, Arrays.asList(null, UUID.randomUUID()));
+        tmp.put(NativeTypeSpec.BITMASK, Arrays.asList(null, fromBinString(""), fromBinString("1"),
                 fromBinString("10101010101010101010101")));
-        tmp.put(ColumnTypeSpec.STRING, Arrays.asList(null, "", UUID.randomUUID().toString()));
-        tmp.put(ColumnTypeSpec.BLOB, Arrays.asList(null, ArrayUtils.BYTE_EMPTY_ARRAY,
+        tmp.put(NativeTypeSpec.STRING, Arrays.asList(null, "", UUID.randomUUID().toString()));
+        tmp.put(NativeTypeSpec.BYTES, Arrays.asList(null, ArrayUtils.BYTE_EMPTY_ARRAY,
                 UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8)));
-        tmp.put(ColumnTypeSpec.NUMBER, Arrays.asList(null, BigInteger.ONE, BigInteger.ZERO,
+        tmp.put(NativeTypeSpec.NUMBER, Arrays.asList(null, BigInteger.ONE, BigInteger.ZERO,
                 new BigInteger("10000000000000000000000000000000000000")));
 
-        var missedTypes = new HashSet<>(Arrays.asList(ColumnTypeSpec.values()));
+        var missedTypes = new HashSet<>(Arrays.asList(NativeTypeSpec.values()));
 
         missedTypes.removeAll(tmp.keySet());
 
@@ -117,41 +119,41 @@ public class AbstractSchemaConverterTest {
         return val;
     }
 
-    /** Creates a column type from given type spec. */
-    protected static ColumnType specToType(ColumnTypeSpec spec) {
+    /** Creates a native type from given type spec. */
+    protected static NativeType specToType(NativeTypeSpec spec) {
         switch (spec) {
             case INT8:
-                return ColumnType.INT8;
+                return NativeTypes.INT8;
             case INT16:
-                return ColumnType.INT16;
+                return NativeTypes.INT16;
             case INT32:
-                return ColumnType.INT32;
+                return NativeTypes.INT32;
             case INT64:
-                return ColumnType.INT64;
+                return NativeTypes.INT64;
             case FLOAT:
-                return ColumnType.FLOAT;
+                return NativeTypes.FLOAT;
             case DOUBLE:
-                return ColumnType.DOUBLE;
+                return NativeTypes.DOUBLE;
             case DECIMAL:
-                return ColumnType.decimal();
+                return NativeTypes.decimalOf(10, 3);
             case DATE:
-                return ColumnType.DATE;
+                return NativeTypes.DATE;
             case TIME:
-                return ColumnType.time();
+                return NativeTypes.time();
             case DATETIME:
-                return ColumnType.datetime();
+                return NativeTypes.datetime();
             case TIMESTAMP:
-                return ColumnType.timestamp();
+                return NativeTypes.timestamp();
             case NUMBER:
-                return ColumnType.number();
+                return NativeTypes.numberOf(DecimalNativeType.DEFAULT_PRECISION);
             case STRING:
-                return ColumnType.string();
+                return NativeTypes.stringOf(8);
             case UUID:
-                return ColumnType.UUID;
-            case BLOB:
-                return ColumnType.blob();
+                return NativeTypes.UUID;
+            case BYTES:
+                return NativeTypes.blobOf(8);
             case BITMASK:
-                return ColumnType.bitmaskOf(10);
+                return NativeTypes.bitmaskOf(10);
             default:
                 throw new IllegalStateException("Unknown type spec [spec=" + spec + ']');
         }
@@ -179,7 +181,7 @@ public class AbstractSchemaConverterTest {
      * Class represents a default value of particular type.
      */
     protected static class DefaultValueArg {
-        final ColumnType type;
+        final NativeType type;
         final Object defaultValue;
 
         /**
@@ -188,14 +190,14 @@ public class AbstractSchemaConverterTest {
          * @param type Type of the value
          * @param defaultValue value itself.
          */
-        public DefaultValueArg(ColumnType type, Object defaultValue) {
+        public DefaultValueArg(NativeType type, Object defaultValue) {
             this.type = type;
             this.defaultValue = defaultValue;
         }
 
         @Override
         public String toString() {
-            return type.typeSpec() + ": " + AbstractSchemaConverterTest.toString(defaultValue);
+            return type.spec() + ": " + AbstractSchemaConverterTest.toString(defaultValue);
         }
     }
 }
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractTableIndexValidatorTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractTableIndexValidatorTest.java
index b82510f4a8..9aa0096a05 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractTableIndexValidatorTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/AbstractTableIndexValidatorTest.java
@@ -29,10 +29,11 @@ import org.apache.ignite.configuration.schemas.table.UnlimitedBudgetConfiguratio
 import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.schema.configuration.schema.TestDataStorageConfigurationSchema;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.builder.TableDefinitionBuilder;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/ConfigurationToSchemaDescriptorConverterTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/ConfigurationToSchemaDescriptorConverterTest.java
new file mode 100644
index 0000000000..a1c1bbc11f
--- /dev/null
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/ConfigurationToSchemaDescriptorConverterTest.java
@@ -0,0 +1,308 @@
+/*
+ * 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.configuration;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+
+import java.util.ArrayList;
+import org.apache.ignite.configuration.schemas.store.UnknownDataStorageConfigurationSchema;
+import org.apache.ignite.configuration.schemas.table.ColumnDefaultConfigurationSchema;
+import org.apache.ignite.configuration.schemas.table.ColumnDefaultView;
+import org.apache.ignite.configuration.schemas.table.ColumnTypeView;
+import org.apache.ignite.configuration.schemas.table.ColumnView;
+import org.apache.ignite.configuration.schemas.table.ConstantValueDefaultView;
+import org.apache.ignite.configuration.schemas.table.FunctionCallDefaultView;
+import org.apache.ignite.configuration.schemas.table.NullValueDefaultConfigurationSchema;
+import org.apache.ignite.configuration.schemas.table.NullValueDefaultView;
+import org.apache.ignite.configuration.schemas.table.TableConfiguration;
+import org.apache.ignite.configuration.schemas.table.UnlimitedBudgetConfigurationSchema;
+import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
+import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
+import org.apache.ignite.internal.schema.BitmaskNativeType;
+import org.apache.ignite.internal.schema.Column;
+import org.apache.ignite.internal.schema.DecimalNativeType;
+import org.apache.ignite.internal.schema.DefaultValueProvider.FunctionalValueProvider;
+import org.apache.ignite.internal.schema.DefaultValueProvider.Type;
+import org.apache.ignite.internal.schema.NativeType;
+import org.apache.ignite.internal.schema.NativeTypeSpec;
+import org.apache.ignite.internal.schema.NativeTypes;
+import org.apache.ignite.internal.schema.NumberNativeType;
+import org.apache.ignite.internal.schema.SchemaDescriptor;
+import org.apache.ignite.internal.schema.TemporalNativeType;
+import org.apache.ignite.internal.schema.VarlenNativeType;
+import org.apache.ignite.internal.schema.testutils.definition.DefaultValueGenerators;
+import org.jetbrains.annotations.Nullable;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.MethodSource;
+
+/**
+ * Tests to verify conversion from configuration views to schema objects.
+ */
+@ExtendWith(ConfigurationExtension.class)
+public class ConfigurationToSchemaDescriptorConverterTest extends AbstractSchemaConverterTest {
+    private static final int TEST_LENGTH = 15;
+
+    private static final int TEST_PRECISION = 8;
+
+    private static final int TEST_SCALE = 5;
+
+    @ParameterizedTest
+    @EnumSource(value = NativeTypeSpec.class)
+    public void convertColumnTypeView(NativeTypeSpec typeSpec) {
+        ColumnTypeView typeView = TestColumnTypeView.forSpec(typeSpec);
+
+        NativeType type = ConfigurationToSchemaDescriptorConverter.convert(typeView);
+
+        assertThat(type.spec().name(), equalTo(typeView.type()));
+
+        if (type instanceof VarlenNativeType) {
+            assertThat(((VarlenNativeType) type).length(), equalTo(TEST_LENGTH));
+        } else if (type instanceof NumberNativeType) {
+            assertThat(((NumberNativeType) type).precision(), equalTo(typeView.precision()));
+        } else if (type instanceof DecimalNativeType) {
+            assertThat(((DecimalNativeType) type).precision(), equalTo(typeView.precision()));
+            assertThat(((DecimalNativeType) type).scale(), equalTo(typeView.scale()));
+        } else if (type instanceof TemporalNativeType) {
+            assertThat(((TemporalNativeType) type).precision(), equalTo(typeView.precision()));
+        } else if (type instanceof BitmaskNativeType) {
+            assertThat(((BitmaskNativeType) type).bits(), equalTo(TEST_LENGTH));
+        } else {
+            assertThat("Unknown type: " + type.getClass(), type.getClass(), equalTo(NativeType.class));
+        }
+    }
+
+    @ParameterizedTest
+    @MethodSource("generateTestArguments")
+    public void convertColumnViewConstantDefault(DefaultValueArg arg) {
+        String columnName = arg.type.spec().name();
+        ColumnTypeView typeView = TestColumnTypeView.forType(arg.type);
+        ColumnDefaultView defaultValueView = createViewForValue(arg.type, arg.defaultValue);
+        ColumnView columnView = new TestColumnView(columnName, typeView, defaultValueView);
+
+        Column column = ConfigurationToSchemaDescriptorConverter.convert(0, columnView);
+
+        assertThat(column.name(), equalTo(columnName));
+        assertThat(column.type(), equalTo(arg.type));
+        assertThat(column.nullable(), equalTo(arg.defaultValue == null));
+        assertThat(column.defaultValueProvider().type(), equalTo(Type.CONSTANT));
+        assertThat(column.defaultValue(), equalTo(arg.defaultValue));
+    }
+
+    @Test
+    public void convertColumnViewFunctionalDefault() {
+        String columnName = "UUID";
+        String functionName = DefaultValueGenerators.GEN_RANDOM_UUID;
+        ColumnTypeView typeView = TestColumnTypeView.forSpec(NativeTypeSpec.UUID);
+        ColumnDefaultView defaultValueView = new TestFunctionCallDefaultView(functionName);
+        ColumnView columnView = new TestColumnView(columnName, typeView, defaultValueView);
+
+        Column column = ConfigurationToSchemaDescriptorConverter.convert(0, columnView);
+
+        assertThat(column.name(), equalTo(columnName));
+        assertThat(column.type(), equalTo(NativeTypes.UUID));
+        assertThat(column.defaultValueProvider().type(), equalTo(Type.FUNCTIONAL));
+        assertThat(((FunctionalValueProvider) column.defaultValueProvider()).name(), equalTo(functionName));
+    }
+
+    @Test
+    public void convertTableView(@InjectConfiguration(
+            polymorphicExtensions = {
+                    UnknownDataStorageConfigurationSchema.class,
+                    NullValueDefaultConfigurationSchema.class,
+                    UnlimitedBudgetConfigurationSchema.class
+            },
+            value = "mock {"
+                    + "primaryKey {columns=[K1, K2], colocationColumns=[K2]},"
+                    + "columns: ["
+                    + "     {name=C1, type.type=INT32},"
+                    + "     {name=K2, type.type=INT32},"
+                    + "     {name=C2, type.type=INT32},"
+                    + "     {name=K1, type.type=INT32},"
+                    + "]"
+                    + "}"
+    ) TableConfiguration tableConfiguration) {
+        SchemaDescriptor schema = ConfigurationToSchemaDescriptorConverter.convert(1, tableConfiguration.value());
+
+        assertThat(schema.keyColumns().length(), equalTo(2));
+        assertThat(schema.keyColumns().column(0).name(), equalTo("K1"));
+        assertThat(schema.keyColumns().column(1).name(), equalTo("K2"));
+        assertThat(schema.valueColumns().length(), equalTo(2));
+        assertThat(schema.valueColumns().column(0).name(), equalTo("C1"));
+        assertThat(schema.valueColumns().column(1).name(), equalTo("C2"));
+        assertThat(schema.colocationColumns().length, equalTo(1));
+        assertThat(schema.colocationColumns()[0].name(), equalTo("K2"));
+    }
+
+    private static Iterable<DefaultValueArg> generateTestArguments() {
+        var paramList = new ArrayList<DefaultValueArg>();
+
+        for (var entry : DEFAULT_VALUES_TO_TEST.entrySet()) {
+            for (var defaultValue : entry.getValue()) {
+                paramList.add(
+                        new DefaultValueArg(specToType(entry.getKey()), adjust(defaultValue))
+                );
+            }
+        }
+        return paramList;
+    }
+
+    private ColumnDefaultView createViewForValue(NativeType type, @Nullable Object value) {
+        if (value == null) {
+            return new TestNullValueDefaultView();
+        }
+
+        return new TestConstantValueDefaultView(ValueSerializationHelper.toString(value, type));
+    }
+
+    private static class TestColumnTypeView implements ColumnTypeView {
+        private final String typeName;
+
+        private final int length;
+
+        private final int precision;
+
+        private final int scale;
+
+        public static TestColumnTypeView forSpec(NativeTypeSpec spec) {
+            return new TestColumnTypeView(spec, TEST_LENGTH, TEST_PRECISION, TEST_SCALE);
+        }
+
+        public static TestColumnTypeView forType(NativeType type) {
+            int length = type instanceof VarlenNativeType ? ((VarlenNativeType) type).length()
+                    : type instanceof BitmaskNativeType ? ((BitmaskNativeType) type).bits()
+                    : 0;
+
+            int precision = type instanceof DecimalNativeType ? ((DecimalNativeType) type).precision()
+                    : type instanceof NumberNativeType ? ((NumberNativeType) type).precision()
+                    : type instanceof TemporalNativeType ? ((TemporalNativeType) type).precision()
+                    : 0;
+
+            int scale = type instanceof DecimalNativeType ? ((DecimalNativeType) type).scale() : 0;
+
+            return new TestColumnTypeView(type.spec(), length, precision, scale);
+        }
+
+        private TestColumnTypeView(NativeTypeSpec spec, int length, int precision, int scale) {
+            this.typeName = spec.name();
+            this.length = length;
+            this.precision = precision;
+            this.scale = scale;
+        }
+
+        @Override
+        public String type() {
+            return typeName;
+        }
+
+        @Override
+        public int length() {
+            return length;
+        }
+
+        @Override
+        public int precision() {
+            return precision;
+        }
+
+        @Override
+        public int scale() {
+            return scale;
+        }
+    }
+
+    private static class TestColumnView implements ColumnView {
+        private final String name;
+
+        private final ColumnTypeView type;
+
+        private final ColumnDefaultView defaultValueView;
+
+        public TestColumnView(String name, ColumnTypeView type, ColumnDefaultView defaultValueView) {
+            this.name = name;
+            this.type = type;
+            this.defaultValueView = defaultValueView;
+        }
+
+        @Override
+        public String name() {
+            return name;
+        }
+
+        @Override
+        public ColumnTypeView type() {
+            return type;
+        }
+
+        @Override
+        public boolean nullable() {
+            return defaultValueView instanceof NullValueDefaultView;
+        }
+
+        @Override
+        public ColumnDefaultView defaultValueProvider() {
+            return defaultValueView;
+        }
+    }
+
+    private static class TestConstantValueDefaultView implements ConstantValueDefaultView {
+        private final String value;
+
+        public TestConstantValueDefaultView(String value) {
+            this.value = value;
+        }
+
+        @Override
+        public String type() {
+            return ColumnDefaultConfigurationSchema.CONSTANT_VALUE_TYPE;
+        }
+
+        @Override
+        public String defaultValue() {
+            return value;
+        }
+    }
+
+    private static class TestNullValueDefaultView implements NullValueDefaultView {
+        @Override
+        public String type() {
+            return ColumnDefaultConfigurationSchema.CONSTANT_VALUE_TYPE;
+        }
+    }
+
+    private static class TestFunctionCallDefaultView implements FunctionCallDefaultView {
+        private final String functionName;
+
+        public TestFunctionCallDefaultView(String functionName) {
+            this.functionName = functionName;
+        }
+
+        @Override
+        public String type() {
+            return ColumnDefaultConfigurationSchema.FUNCTION_CALL_TYPE;
+        }
+
+        @Override
+        public String functionName() {
+            return functionName;
+        }
+    }
+}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/IndexValidatorImplTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/IndexValidatorImplTest.java
deleted file mode 100644
index e4dee1c6d3..0000000000
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/IndexValidatorImplTest.java
+++ /dev/null
@@ -1,69 +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.schema.configuration;
-
-import static org.apache.ignite.internal.configuration.validation.TestValidationUtil.validate;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.List;
-import java.util.UUID;
-import org.apache.ignite.configuration.NamedConfigurationTree;
-import org.apache.ignite.configuration.NamedListView;
-import org.apache.ignite.configuration.schemas.table.HashIndexChange;
-import org.apache.ignite.configuration.schemas.table.IndexValidator;
-import org.apache.ignite.configuration.schemas.table.TableChange;
-import org.apache.ignite.configuration.schemas.table.TableConfiguration;
-import org.apache.ignite.configuration.schemas.table.TableIndexView;
-import org.apache.ignite.configuration.schemas.table.TableView;
-import org.apache.ignite.configuration.schemas.table.TablesView;
-import org.apache.ignite.configuration.validation.ValidationContext;
-import org.apache.ignite.internal.configuration.NamedListConfiguration;
-import org.junit.jupiter.api.Test;
-
-/** Index validator tests. */
-public class IndexValidatorImplTest extends AbstractTableIndexValidatorTest {
-    /** Tests that validator finds no issues in a simple valid configuration. */
-    @Test
-    public void testNoIssues() throws Exception {
-        ValidationContext<NamedListView<TableIndexView>> ctxIdx = mock(ValidationContext.class);
-
-        NamedConfigurationTree<TableConfiguration, TableView, TableChange> cfg0 = tablesCfg.tables();
-
-        List<UUID> ids = ((NamedListConfiguration<TableConfiguration, ?, ?>) cfg0).internalIds();
-
-        assertEquals(1, ids.size());
-
-        UUID tableId = ids.get(0);
-
-        TablesView oldRoot = tablesCfg.value();
-
-        tablesCfg.indexes().change(c -> c.create("schema.idx", idxCng -> idxCng.convert(HashIndexChange.class)
-                .changeColumnNames("ID2").changeTableId(tableId))).get();
-
-        TablesView view = tablesCfg.value();
-
-        when(ctxIdx.getNewRoot(any())).thenReturn(view);
-
-        when(ctxIdx.getOldRoot(any())).thenReturn(oldRoot);
-
-        validate(IndexValidatorImpl.INSTANCE, mock(IndexValidator.class), ctxIdx, null);
-    }
-}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverterTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverterTest.java
deleted file mode 100644
index 45ecc1bbba..0000000000
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverterTest.java
+++ /dev/null
@@ -1,388 +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.schema.configuration;
-
-import static org.apache.ignite.configuration.annotation.ConfigurationType.DISTRIBUTED;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasSize;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-import java.util.stream.Collectors;
-import org.apache.ignite.configuration.NamedConfigurationTree;
-import org.apache.ignite.configuration.schemas.store.UnknownDataStorageConfigurationSchema;
-import org.apache.ignite.configuration.schemas.table.ConstantValueDefaultConfigurationSchema;
-import org.apache.ignite.configuration.schemas.table.EntryCountBudgetConfigurationSchema;
-import org.apache.ignite.configuration.schemas.table.FunctionCallDefaultConfigurationSchema;
-import org.apache.ignite.configuration.schemas.table.HashIndexConfiguration;
-import org.apache.ignite.configuration.schemas.table.HashIndexConfigurationSchema;
-import org.apache.ignite.configuration.schemas.table.IndexValidator;
-import org.apache.ignite.configuration.schemas.table.NullValueDefaultConfigurationSchema;
-import org.apache.ignite.configuration.schemas.table.SortedIndexConfigurationSchema;
-import org.apache.ignite.configuration.schemas.table.SortedIndexView;
-import org.apache.ignite.configuration.schemas.table.TableChange;
-import org.apache.ignite.configuration.schemas.table.TableConfiguration;
-import org.apache.ignite.configuration.schemas.table.TableIndexChange;
-import org.apache.ignite.configuration.schemas.table.TableIndexConfiguration;
-import org.apache.ignite.configuration.schemas.table.TableIndexView;
-import org.apache.ignite.configuration.schemas.table.TableValidator;
-import org.apache.ignite.configuration.schemas.table.TableView;
-import org.apache.ignite.configuration.schemas.table.TablesConfiguration;
-import org.apache.ignite.configuration.schemas.table.UnlimitedBudgetConfigurationSchema;
-import org.apache.ignite.internal.configuration.ConfigurationRegistry;
-import org.apache.ignite.internal.configuration.NamedListConfiguration;
-import org.apache.ignite.internal.configuration.storage.TestConfigurationStorage;
-import org.apache.ignite.internal.schema.definition.ColumnDefinitionImpl;
-import org.apache.ignite.internal.schema.testutils.builder.HashIndexDefinitionBuilder;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.internal.schema.testutils.builder.SortedIndexDefinitionBuilder;
-import org.apache.ignite.internal.schema.testutils.builder.TableDefinitionBuilder;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.ConstantValue;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.FunctionCall;
-import org.apache.ignite.schema.definition.DefaultValueGenerators;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.schema.definition.index.HashIndexDefinition;
-import org.apache.ignite.schema.definition.index.IndexColumnDefinition;
-import org.apache.ignite.schema.definition.index.SortOrder;
-import org.apache.ignite.schema.definition.index.SortedIndexColumnDefinition;
-import org.apache.ignite.schema.definition.index.SortedIndexDefinition;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.MethodSource;
-
-/**
- * SchemaConfigurationConverter tests.
- */
-@SuppressWarnings("InstanceVariableMayNotBeInitialized")
-public class SchemaConfigurationConverterTest extends AbstractSchemaConverterTest {
-    /** Table builder. */
-    private TableDefinitionBuilder tblBuilder;
-
-    /** Configuration registry with one table for each test. */
-    private ConfigurationRegistry confRegistry;
-
-    /** Registered table id. */
-    private UUID tableId;
-
-    /**
-     * Prepare configuration registry for test.
-     *
-     * @throws ExecutionException If failed.
-     * @throws InterruptedException If failed.
-     */
-    @BeforeEach
-    public void createRegistry() throws Exception {
-        confRegistry = new ConfigurationRegistry(
-                List.of(TablesConfiguration.KEY),
-                Map.of(TableValidator.class, Set.of(TableValidatorImpl.INSTANCE),
-                        IndexValidator.class, Set.of(IndexValidatorImpl.INSTANCE)),
-                new TestConfigurationStorage(DISTRIBUTED),
-                List.of(),
-                List.of(
-                        HashIndexConfigurationSchema.class,
-                        SortedIndexConfigurationSchema.class,
-
-                        UnknownDataStorageConfigurationSchema.class,
-                        ConstantValueDefaultConfigurationSchema.class,
-                        FunctionCallDefaultConfigurationSchema.class,
-                        NullValueDefaultConfigurationSchema.class,
-                        UnlimitedBudgetConfigurationSchema.class,
-                        EntryCountBudgetConfigurationSchema.class
-                )
-        );
-
-        confRegistry.start();
-
-        tblBuilder = SchemaBuilders.tableBuilder("SNAME", "TNAME")
-                .columns(
-                        SchemaBuilders.column("COL1", ColumnType.DOUBLE).build(),
-                        SchemaBuilders.column("COL2", ColumnType.DOUBLE).build(),
-                        SchemaBuilders.column("A", ColumnType.INT8).build(),
-                        SchemaBuilders.column("B", ColumnType.INT8).build(),
-                        SchemaBuilders.column("C", ColumnType.INT8).build()
-                ).withPrimaryKey("COL1");
-
-        TableDefinition tbl = tblBuilder.build();
-
-        confRegistry.getConfiguration(TablesConfiguration.KEY).change(
-                ch -> SchemaConfigurationConverter.createTable(tbl, ch)
-                        .changeTables(
-                                tblsCh -> tblsCh.update(tbl.canonicalName(), tblCh -> tblCh.changeReplicas(1).changeTableId(1))
-                        )
-        ).get();
-
-        NamedConfigurationTree<TableConfiguration, TableView, TableChange> cfg0 = getConfiguration().tables();
-
-        List<UUID> ids = ((NamedListConfiguration<TableConfiguration, ?, ?>) cfg0).internalIds();
-
-        assertEquals(1, ids.size());
-
-        tableId = ids.get(0);
-    }
-
-    @AfterEach
-    void tearDown() throws Exception {
-        confRegistry.stop();
-    }
-
-    /**
-     * Add/remove HashIndex into configuration and read it back.
-     */
-    @Test
-    public void testConvertHashIndex() throws Exception {
-        HashIndexDefinitionBuilder builder = SchemaBuilders.hashIndex("testHI")
-                .withColumns("A", "B", "C")
-                .withHints(Collections.singletonMap("param", "value"));
-        HashIndexDefinition idx = builder.build();
-
-        getConfiguration().indexes().change(change -> change.create(idx.name(), ch ->
-                SchemaConfigurationConverter.addIndex(idx, tableId, ch))).get();
-
-        HashIndexConfiguration idxCfg = (HashIndexConfiguration) getConfiguration().indexes().get(idx.name());
-
-        assertNotNull(idxCfg);
-
-        assertEquals("HASH", idxCfg.type().value());
-        assertEquals(3, idxCfg.columnNames().value().length);
-        assertEquals(idxCfg.tableId().value(), tableId);
-    }
-
-    /**
-     * Add/remove SortedIndex into configuration and read it back.
-     */
-    @Test
-    public void testConvertSortedIndex() throws Exception {
-        SortedIndexDefinitionBuilder builder = SchemaBuilders.sortedIndex("SIDX");
-
-        builder.addIndexColumn("A").asc().done();
-        builder.addIndexColumn("B").desc().done();
-
-        SortedIndexDefinition idx = builder.build();
-
-        NamedConfigurationTree<TableIndexConfiguration, TableIndexView, TableIndexChange> idxConfig = getConfiguration().indexes();
-
-        idxConfig.change(change -> change.create(idx.name(), ch ->
-                SchemaConfigurationConverter.addIndex(idx, tableId, ch))).get();;
-
-        SortedIndexView idx2 = (SortedIndexView) idxConfig.get(idx.name()).value();
-
-        assertNotNull(idx2);
-        assertEquals("SORTED", idx2.type());
-        assertEquals(2, idx2.columns().size());
-        assertEquals("A", idx2.columns().get(0).name());
-        assertEquals("B", idx2.columns().get(1).name());
-        SortedIndexColumnDefinition col0 = SchemaConfigurationConverter.convert(idx2.columns().get(0));
-        SortedIndexColumnDefinition col1 = SchemaConfigurationConverter.convert(idx2.columns().get(1));
-        assertEquals(SortOrder.ASC, col0.sortOrder());
-        assertEquals(SortOrder.DESC, col1.sortOrder());
-    }
-
-    /**
-     * Add/remove index on primary key into configuration and read it back.
-     */
-    @Test
-    public void testUniqIndex() throws Exception {
-        SortedIndexDefinition idx = SchemaBuilders.sortedIndex("pk_sorted")
-                .addIndexColumn("COL1").desc().done()
-                .unique(true)
-                .build();
-
-        getConfiguration().indexes().change(change -> change.create(idx.name(), ch ->
-                SchemaConfigurationConverter.addIndex(idx, tableId, ch))).get();
-
-        SortedIndexView idx2 = (SortedIndexView) getConfiguration().indexes().get(idx.name()).value();
-
-        assertNotNull(idx2);
-        assertEquals("PK_SORTED", idx2.name());
-        assertEquals("SORTED", idx2.type());
-        assertEquals(idx.columns().stream().map(IndexColumnDefinition::name).collect(Collectors.toList()),
-                new ArrayList<>(idx2.columns().namedListKeys()));
-        assertTrue(idx2.uniq());
-    }
-
-    /**
-     * Detect an index containing affinity key as unique one.
-     */
-    @Disabled("https://issues.apache.org/jira/browse/IGNITE-15483")
-    @Test
-    public void testUniqueIndexDetection() throws Exception {
-        SortedIndexDefinition idx = SchemaBuilders.sortedIndex("uniq_sorted")
-                .addIndexColumn("A").done()
-                .addIndexColumn("COL1").desc().done()
-                .build();
-
-        getConfiguration().indexes().change(change -> change.create(idx.canonicalName(), ch ->
-                SchemaConfigurationConverter.addIndex(idx, tableId, ch))).get();
-
-        SortedIndexView idx2 = (SortedIndexView) getConfiguration().indexes().get(idx.name()).value();
-
-        assertNotNull(idx2);
-        assertEquals("uniq_sorted", idx2.name().toLowerCase(Locale.US));
-        assertEquals("SORTED", idx2.type());
-
-        assertTrue(idx2.uniq());
-
-        assertEquals(2, idx2.columns().size());
-        assertEquals("A", idx2.columns().get(0).name());
-        assertEquals("COL1", idx2.columns().get(1).name());
-        SortedIndexColumnDefinition col0 = SchemaConfigurationConverter.convert(idx2.columns().get(0));
-        SortedIndexColumnDefinition col1 = SchemaConfigurationConverter.convert(idx2.columns().get(1));
-        assertEquals(SortOrder.ASC, col0.sortOrder());
-        assertEquals(SortOrder.DESC, col1.sortOrder());
-    }
-
-    /**
-     * Add/remove table and read it back.
-     */
-    @Test
-    public void testConvertTable() {
-        TableDefinition tbl = tblBuilder.build();
-
-        TableConfiguration tblCfg = confRegistry.getConfiguration(TablesConfiguration.KEY).tables().get(tbl.canonicalName());
-
-        TableDefinition tbl2 = SchemaConfigurationConverter.convert(tblCfg);
-
-        assertEquals(tbl.canonicalName(), tbl2.canonicalName());
-        assertEquals(tbl.keyColumns().size(), tbl2.keyColumns().size());
-        assertEquals(tbl.colocationColumns().size(), tbl2.colocationColumns().size());
-        assertEquals(tbl.columns().size(), tbl2.columns().size());
-    }
-
-    /**
-     * Validates conversion of functional default.
-     */
-    @Test
-    public void convertFunctionalDefault() {
-        final var keyColumnName = "KEY";
-
-        TableDefinition tableDefinition = SchemaBuilders.tableBuilder("PUBLIC", "TEST")
-                .columns(
-                        new ColumnDefinitionImpl(
-                                keyColumnName, ColumnType.string(), false,
-                                DefaultValueDefinition.functionCall(DefaultValueGenerators.GEN_RANDOM_UUID)
-                        ),
-                        SchemaBuilders.column("VAL", ColumnType.INT8).build()
-                )
-                .withPrimaryKey(keyColumnName)
-                .build();
-
-        confRegistry.getConfiguration(TablesConfiguration.KEY).change(
-                ch -> SchemaConfigurationConverter.createTable(tableDefinition, ch)
-                        .changeTables(
-                                tblsCh -> tblsCh.update(tableDefinition.canonicalName(), tblCh -> tblCh.changeReplicas(1).changeTableId(1))
-                        )
-        ).join();
-
-        var tableConfiguration = confRegistry.getConfiguration(TablesConfiguration.KEY)
-                .tables().get(tableDefinition.canonicalName());
-
-        var columns = SchemaConfigurationConverter.convert(tableConfiguration.value()).columns();
-
-        assertThat(columns, hasSize(2));
-        assertThat(columns.get(0).name(), equalTo(keyColumnName));
-        assertThat(columns.get(0).defaultValueDefinition(), instanceOf(FunctionCall.class));
-        assertThat(((FunctionCall) columns.get(0).defaultValueDefinition()).functionName(),
-                equalTo(DefaultValueGenerators.GEN_RANDOM_UUID));
-    }
-
-    /**
-     * Ensures that column default are properly converted from definition to configuration and vice versa.
-     *
-     * @param arg Argument object describing default value to verify.
-     */
-    @ParameterizedTest
-    @MethodSource("generateTestArguments")
-    public void convertDefaults(DefaultValueArg arg) {
-        final String keyColumnName = "ID";
-
-        var columnName = arg.type.typeSpec().name();
-
-        var tableDefinition = SchemaBuilders.tableBuilder("PUBLIC", "TEST")
-                .columns(
-                        SchemaBuilders.column(keyColumnName, ColumnType.INT32).build(),
-                        SchemaBuilders.column(columnName, arg.type).withDefaultValue(arg.defaultValue).build()
-                )
-                .withPrimaryKey("ID")
-                .build();
-
-        confRegistry.getConfiguration(TablesConfiguration.KEY).change(
-                ch -> SchemaConfigurationConverter.createTable(tableDefinition, ch)
-                        .changeTables(
-                                tblsCh -> tblsCh.update(tableDefinition.canonicalName(), tblCh -> tblCh.changeReplicas(1).changeTableId(1))
-                        )
-        ).join();
-
-        var tableConfiguration = confRegistry.getConfiguration(TablesConfiguration.KEY)
-                .tables().get(tableDefinition.canonicalName());
-
-        var columns = SchemaConfigurationConverter.convert(tableConfiguration.value()).columns();
-
-        assertThat(columns, hasSize(2));
-        assertThat(columns.get(0).name(), equalTo(keyColumnName));
-
-        var targetColumn = columns.get(1);
-
-        assertThat(targetColumn.name(), equalTo(columnName));
-        assertThat(targetColumn.type(), equalTo(arg.type));
-
-        if (arg.defaultValue != null) {
-            assertThat(targetColumn.defaultValueDefinition(), instanceOf(ConstantValue.class));
-            assertThat(((ConstantValue) targetColumn.defaultValueDefinition()).value(), equalTo(arg.defaultValue));
-        } else {
-            assertThat(targetColumn.defaultValueDefinition(), instanceOf(DefaultValueDefinition.class));
-        }
-    }
-
-    /**
-     * Get tests default index configuration.
-     *
-     * @return Indexes configuration.
-     */
-    private TablesConfiguration getConfiguration() {
-        return confRegistry.getConfiguration(TablesConfiguration.KEY);
-    }
-
-    private static Iterable<DefaultValueArg> generateTestArguments() {
-        var paramList = new ArrayList<DefaultValueArg>();
-
-        for (var entry : DEFAULT_VALUES_TO_TEST.entrySet()) {
-            for (var defaultValue : entry.getValue()) {
-                paramList.add(
-                        new DefaultValueArg(specToType(entry.getKey()), adjust(defaultValue))
-                );
-            }
-        }
-        return paramList;
-    }
-}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverterTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverterTest.java
deleted file mode 100644
index daec0e4ec5..0000000000
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/configuration/SchemaDescriptorConverterTest.java
+++ /dev/null
@@ -1,296 +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.schema.configuration;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.function.Function;
-import org.apache.ignite.internal.schema.Column;
-import org.apache.ignite.internal.schema.Columns;
-import org.apache.ignite.internal.schema.DefaultValueGenerator;
-import org.apache.ignite.internal.schema.DefaultValueProvider.FunctionalValueProvider;
-import org.apache.ignite.internal.schema.DefaultValueProvider.Type;
-import org.apache.ignite.internal.schema.NativeTypeSpec;
-import org.apache.ignite.internal.schema.SchemaDescriptor;
-import org.apache.ignite.internal.schema.definition.ColumnDefinitionImpl;
-import org.apache.ignite.internal.schema.testutils.builder.ColumnDefinitionBuilder;
-import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
-import org.apache.ignite.internal.schema.testutils.builder.TableDefinitionBuilder;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition;
-import org.apache.ignite.schema.definition.DefaultValueGenerators;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.MethodSource;
-
-/**
- * Tests for SchemaDescriptorConverter.
- */
-public class SchemaDescriptorConverterTest extends AbstractSchemaConverterTest {
-    /** Total number of columns. */
-    private static final int columns = 15;
-
-    /**
-     * Convert table with complex primary key and check it.
-     */
-    @Test
-    public void testComplexPrimaryKey() {
-        TableDefinitionBuilder bldr = getBuilder(false, false);
-        TableDefinition tblSchm = bldr.withPrimaryKey(
-                SchemaBuilders.primaryKey()
-                        .withColumns("INT8", "ID")
-                        .build()
-        ).build();
-
-        SchemaDescriptor tblDscr = SchemaDescriptorConverter.convert(1, tblSchm);
-
-        assertEquals(2, tblDscr.keyColumns().length());
-        assertEquals(2, tblDscr.colocationColumns().length);
-        assertEquals(columns - 2, tblDscr.valueColumns().length());
-    }
-
-    /**
-     * Convert table with complex primary key with affinity column configured and check it.
-     */
-    @Test
-    public void testComplexPrimaryKeyWithAffinity() {
-        TableDefinitionBuilder bldr = getBuilder(false, false);
-        TableDefinition tblSchm = bldr.withPrimaryKey(
-                SchemaBuilders.primaryKey()
-                        .withColumns("INT8", "ID")
-                        .withColocationColumns("INT8")
-                        .build()
-        ).build();
-
-        SchemaDescriptor tblDscr = SchemaDescriptorConverter.convert(1, tblSchm);
-
-        assertEquals(2, tblDscr.keyColumns().length());
-        assertEquals(1, tblDscr.colocationColumns().length);
-        assertEquals(columns - 2, tblDscr.valueColumns().length());
-    }
-
-    /**
-     * Convert table with nullable columns.
-     */
-    @Test
-    public void convertNullable() {
-        TableDefinition tblSchm = getBuilder(true, true).build();
-
-        SchemaDescriptor tblDscr = SchemaDescriptorConverter.convert(1, tblSchm);
-
-        assertEquals(1, tblDscr.keyColumns().length());
-        testCol(tblDscr.keyColumns(), "ID", NativeTypeSpec.UUID, false);
-
-        assertEquals(columns - 1, tblDscr.valueColumns().length());
-        testCol(tblDscr.valueColumns(), "INT8", NativeTypeSpec.INT8, true);
-        testCol(tblDscr.valueColumns(), "INT16", NativeTypeSpec.INT16, true);
-        testCol(tblDscr.valueColumns(), "INT32", NativeTypeSpec.INT32, true);
-        testCol(tblDscr.valueColumns(), "INT64", NativeTypeSpec.INT64, true);
-        testCol(tblDscr.valueColumns(), "FLOAT", NativeTypeSpec.FLOAT, true);
-        testCol(tblDscr.valueColumns(), "DOUBLE", NativeTypeSpec.DOUBLE, true);
-        testCol(tblDscr.valueColumns(), "UUID", NativeTypeSpec.UUID, true);
-        testCol(tblDscr.valueColumns(), "STRING", NativeTypeSpec.STRING, true);
-        testCol(tblDscr.valueColumns(), "STRING_FS10", NativeTypeSpec.STRING, true);
-        testCol(tblDscr.valueColumns(), "BLOB", NativeTypeSpec.BYTES, true);
-        testCol(tblDscr.valueColumns(), "DECIMAL", NativeTypeSpec.DECIMAL, true);
-        testCol(tblDscr.valueColumns(), "NUMBER", NativeTypeSpec.NUMBER, true);
-        testCol(tblDscr.valueColumns(), "DECIMAL", NativeTypeSpec.DECIMAL, true);
-        testCol(tblDscr.valueColumns(), "BITMASK_FS10", NativeTypeSpec.BITMASK, true);
-    }
-
-    @ParameterizedTest
-    @MethodSource("generateTestArguments")
-    public void convertDefaultValues(DefaultValueArg arg) {
-        final String keyColumnName = "ID";
-
-        var columnName = arg.type.typeSpec().name();
-        var nullable = arg.defaultValue == null;
-
-        var tableDefinition = SchemaBuilders.tableBuilder("PUBLIC", "TEST")
-                .columns(
-                        SchemaBuilders.column(keyColumnName, ColumnType.INT32).build(),
-                        SchemaBuilders.column(columnName, arg.type)
-                                .withDefaultValue(arg.defaultValue)
-                                .asNullable(nullable)
-                                .build()
-                )
-                .withPrimaryKey(keyColumnName)
-                .build();
-
-        SchemaDescriptor schemaDescriptor = SchemaDescriptorConverter.convert(1, tableDefinition);
-
-        assertEquals(1, schemaDescriptor.valueColumns().length());
-
-        var column = schemaDescriptor.valueColumns().columns()[0];
-
-        assertThat(column.name(), equalTo(columnName));
-        assertThat(column.nullable(), equalTo(nullable));
-        assertThat(column.defaultValueProvider().type(), equalTo(Type.CONSTANT));
-        assertThat(column.defaultValue(), equalTo(arg.defaultValue));
-    }
-
-    /**
-     * Validates conversion of functional default.
-     */
-    @Test
-    public void convertFunctionalDefault() {
-        final String keyColumnName = "ID";
-
-        var tableDefinition = SchemaBuilders.tableBuilder("PUBLIC", "TEST")
-                .columns(
-                        new ColumnDefinitionImpl(
-                                keyColumnName, ColumnType.string(), false,
-                                DefaultValueDefinition.functionCall(DefaultValueGenerators.GEN_RANDOM_UUID)
-                        ),
-                        SchemaBuilders.column("VAL", ColumnType.INT8).asNullable(true).build()
-                )
-                .withPrimaryKey(keyColumnName)
-                .build();
-
-        SchemaDescriptor schemaDescriptor = SchemaDescriptorConverter.convert(1, tableDefinition);
-
-        assertEquals(1, schemaDescriptor.keyColumns().length());
-
-        var column = schemaDescriptor.keyColumns().columns()[0];
-
-        assertThat(column.name(), equalTo(keyColumnName));
-        assertThat(column.nullable(), equalTo(false));
-        assertThat(column.defaultValueProvider().type(), equalTo(Type.FUNCTIONAL));
-        assertThat(((FunctionalValueProvider) column.defaultValueProvider()).name(), equalTo(DefaultValueGenerator.GEN_RANDOM_UUID.name()));
-    }
-
-    /**
-     * Convert table with complex primary key and check it.
-     */
-    @Test
-    public void testColumnOrder() {
-        ColumnDefinition[] cols = {
-                SchemaBuilders.column("ID", ColumnType.UUID).build(),
-                SchemaBuilders.column("STRING", ColumnType.string()).build(),
-                SchemaBuilders.column("INT32", ColumnType.INT32).build(),
-                SchemaBuilders.column("INT64", ColumnType.INT64).build(),
-                SchemaBuilders.column("DOUBLE", ColumnType.DOUBLE).build(),
-                SchemaBuilders.column("UUID", ColumnType.UUID).build(),
-                SchemaBuilders.column("INT16", ColumnType.INT16).build(),
-                SchemaBuilders.column("BITMASK_FS10", ColumnType.bitmaskOf(10)).build()
-        };
-
-        TableDefinition tblSchm = SchemaBuilders.tableBuilder("SCHEMA", "TABLE")
-                .columns(cols)
-                .withPrimaryKey(
-                        SchemaBuilders.primaryKey()
-                                .withColumns("INT32", "ID")
-                                .withColocationColumns("INT32")
-                                .build()
-                ).build();
-
-        SchemaDescriptor tblDscr = SchemaDescriptorConverter.convert(1, tblSchm);
-
-        for (int i = 0; i < cols.length; i++) {
-            Column col = tblDscr.column(i);
-
-            assertEquals(col.name(), cols[col.columnOrder()].name());
-        }
-
-        assertArrayEquals(Arrays.stream(cols).map(ColumnDefinition::name).toArray(String[]::new),
-                tblDscr.columnNames().toArray(String[]::new));
-    }
-
-    /**
-     * Get TableSchemaBuilder with default table.
-     *
-     * @param nullable If all columns should be nullable.
-     * @param withPk   If builder should contains primary key index.
-     * @return TableSchemaBuilder.
-     */
-    private TableDefinitionBuilder getBuilder(boolean nullable, boolean withPk) {
-        Function<ColumnDefinitionBuilder, ColumnDefinition> postProcess =
-                builder -> builder.asNullable(nullable).build();
-
-        TableDefinitionBuilder res = SchemaBuilders.tableBuilder("SCHEMA", "TABLE")
-                .columns(
-                        SchemaBuilders.column("ID", ColumnType.UUID).build(),
-                        postProcess.apply(SchemaBuilders.column("INT8", ColumnType.INT8)),
-                        postProcess.apply(SchemaBuilders.column("INT16", ColumnType.INT16)),
-                        postProcess.apply(SchemaBuilders.column("INT32", ColumnType.INT32)),
-                        postProcess.apply(SchemaBuilders.column("INT64", ColumnType.INT64)),
-                        postProcess.apply(SchemaBuilders.column("FLOAT", ColumnType.FLOAT)),
-                        postProcess.apply(SchemaBuilders.column("DOUBLE", ColumnType.DOUBLE)),
-                        postProcess.apply(SchemaBuilders.column("UUID", ColumnType.UUID)),
-                        postProcess.apply(SchemaBuilders.column("STRING", ColumnType.string())),
-                        postProcess.apply(SchemaBuilders.column("STRING_FS10", ColumnType.stringOf(10))),
-                        postProcess.apply(SchemaBuilders.column("BLOB", ColumnType.blob())),
-                        postProcess.apply(SchemaBuilders.column("BLOB_FS10", ColumnType.blobOf(10))),
-                        postProcess.apply(SchemaBuilders.column("DECIMAL", ColumnType.decimalOf(1, 1))),
-                        postProcess.apply(SchemaBuilders.column("NUMBER", ColumnType.numberOf(12))),
-                        postProcess.apply(SchemaBuilders.column("BITMASK_FS10", ColumnType.bitmaskOf(10)))
-                // TODO: IGNITE-13750 uncomment after unsigned types available
-                // postProcess.apply(SchemaBuilders.column("UINT8", ColumnType.UINT8)),
-                // postProcess.apply(SchemaBuilders.column("UINT16", ColumnType.UINT16)),
-                // postProcess.apply(SchemaBuilders.column("UINT32", ColumnType.UINT32)),
-                // postProcess.apply(SchemaBuilders.column("UINT64", ColumnType.UINT64)),
-                );
-        if (withPk) {
-            res.withPrimaryKey("ID");
-        }
-
-        return res;
-    }
-
-    /**
-     * Check specified column to match other parameters.
-     *
-     * @param cols     Columns to test.
-     * @param name     Expected column name.
-     * @param type     Expected column type.
-     * @param nullable Expected column nullable flag.
-     */
-    private static void testCol(Columns cols, String name, NativeTypeSpec type, boolean nullable) {
-        int idx = cols.columnIndex(name);
-        Column col = cols.column(idx);
-
-        assertEquals(name, col.name());
-        assertEquals(type.name(), col.type().spec().name());
-        assertEquals(nullable, col.nullable());
-
-        if (col.type().spec().fixedLength()) {
-            assertTrue(col.type().sizeInBytes() >= 0);
-        }
-    }
-
-    private static Iterable<DefaultValueArg> generateTestArguments() {
-        var paramList = new ArrayList<DefaultValueArg>();
-
-        for (var entry : DEFAULT_VALUES_TO_TEST.entrySet()) {
-            for (var defaultValue : entry.getValue()) {
-                paramList.add(
-                        new DefaultValueArg(specToType(entry.getKey()), adjust(defaultValue))
-                );
-            }
-        }
-        return paramList;
-    }
-}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java
index f06aabb090..455771d2a3 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/serializer/AbstractSerializerTest.java
@@ -46,6 +46,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.internal.schema.Column;
+import org.apache.ignite.internal.schema.DecimalNativeType;
 import org.apache.ignite.internal.schema.DefaultValueProvider.Type;
 import org.apache.ignite.internal.schema.NativeType;
 import org.apache.ignite.internal.schema.NativeTypeSpec;
@@ -55,8 +56,8 @@ import org.apache.ignite.internal.schema.mapping.ColumnMapper;
 import org.apache.ignite.internal.schema.mapping.ColumnMapping;
 import org.apache.ignite.internal.schema.marshaller.schema.AbstractSchemaSerializer;
 import org.apache.ignite.internal.schema.marshaller.schema.SchemaSerializerImpl;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType.DecimalColumnType;
 import org.apache.ignite.internal.util.ArrayUtils;
-import org.apache.ignite.schema.definition.ColumnType.DecimalColumnType;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -334,7 +335,7 @@ public class AbstractSerializerTest {
             case DOUBLE:
                 return NativeTypes.DOUBLE;
             case DECIMAL:
-                return NativeTypes.decimalOf(DecimalColumnType.DEFAULT_PRECISION, DecimalColumnType.DEFAULT_SCALE);
+                return NativeTypes.decimalOf(DecimalNativeType.DEFAULT_PRECISION, DecimalNativeType.DEFAULT_SCALE);
             case DATE:
                 return NativeTypes.DATE;
             case TIME:
@@ -344,7 +345,7 @@ public class AbstractSerializerTest {
             case TIMESTAMP:
                 return NativeTypes.timestamp();
             case NUMBER:
-                return NativeTypes.numberOf(DecimalColumnType.DEFAULT_PRECISION);
+                return NativeTypes.numberOf(DecimalNativeType.DEFAULT_PRECISION);
             case STRING:
                 return NativeTypes.stringOf(Byte.MAX_VALUE);
             case UUID:
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverter.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaConfigurationConverter.java
similarity index 88%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverter.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaConfigurationConverter.java
index fce92a95bf..7a7386feec 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/SchemaConfigurationConverter.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/SchemaConfigurationConverter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.configuration;
+package org.apache.ignite.internal.schema.testutils;
 
 import static java.math.RoundingMode.HALF_UP;
 import static java.util.Arrays.asList;
@@ -60,27 +60,27 @@ import org.apache.ignite.configuration.schemas.table.TableIndexChange;
 import org.apache.ignite.configuration.schemas.table.TableIndexView;
 import org.apache.ignite.configuration.schemas.table.TableView;
 import org.apache.ignite.configuration.schemas.table.TablesChange;
-import org.apache.ignite.internal.schema.definition.ColumnDefinitionImpl;
-import org.apache.ignite.internal.schema.definition.TableDefinitionImpl;
-import org.apache.ignite.internal.schema.definition.index.HashIndexDefinitionImpl;
-import org.apache.ignite.internal.schema.definition.index.PrimaryKeyDefinitionImpl;
-import org.apache.ignite.internal.schema.definition.index.SortedIndexColumnDefinitionImpl;
-import org.apache.ignite.internal.schema.definition.index.SortedIndexDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType.DecimalColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.DefaultValueDefinition;
+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.PrimaryKeyDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.index.HashIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.HashIndexDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.index.IndexColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.IndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.PrimaryKeyDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortOrder;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexColumnDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexDefinitionImpl;
 import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.ColumnType.DecimalColumnType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.ConstantValue;
-import org.apache.ignite.schema.definition.DefaultValueDefinition.FunctionCall;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.schema.definition.index.HashIndexDefinition;
-import org.apache.ignite.schema.definition.index.IndexColumnDefinition;
-import org.apache.ignite.schema.definition.index.IndexDefinition;
-import org.apache.ignite.schema.definition.index.SortOrder;
-import org.apache.ignite.schema.definition.index.SortedIndexColumnDefinition;
-import org.apache.ignite.schema.definition.index.SortedIndexDefinition;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -104,8 +104,7 @@ public class SchemaConfigurationConverter {
     }
 
     /**
-     * Put type.
-     * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
+     * Put type. TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
      *
      * @param type Column type.
      */
@@ -116,7 +115,7 @@ public class SchemaConfigurationConverter {
     /**
      * Convert SortedIndexColumn to IndexColumnChange.
      *
-     * @param col     IndexColumnChange.
+     * @param col IndexColumnChange.
      * @param colInit IndexColumnChange to fulfill.
      * @return IndexColumnChange to get result from.
      */
@@ -139,7 +138,7 @@ public class SchemaConfigurationConverter {
     /**
      * Convert TableIndex to TableIndexChange.
      *
-     * @param idx    TableIndex.
+     * @param idx TableIndex.
      * @param idxChg TableIndexChange to fulfill.
      * @return TableIndexChange to get result from.
      */
@@ -212,7 +211,7 @@ public class SchemaConfigurationConverter {
     /**
      * Convert ColumnType to ColumnTypeChange.
      *
-     * @param colType    ColumnType.
+     * @param colType ColumnType.
      * @param colTypeChg ColumnTypeChange to fulfill.
      * @return ColumnTypeChange to get result from
      */
@@ -226,11 +225,15 @@ public class SchemaConfigurationConverter {
 
             switch (typeName) {
                 case "BITMASK":
-                case "BLOB":
+                case "BYTES":
                 case "STRING":
-                    ColumnType.VarLenColumnType varLenColType = (ColumnType.VarLenColumnType) colType;
+                    int length = ((ColumnType.VarLenColumnType) colType).length();
+
+                    if (length == 0) {
+                        length = Integer.MAX_VALUE;
+                    }
 
-                    colTypeChg.changeLength(varLenColType.length());
+                    colTypeChg.changeLength(length);
 
                     break;
 
@@ -322,7 +325,7 @@ public class SchemaConfigurationConverter {
     /**
      * Convert column to column change.
      *
-     * @param col    Column to convert.
+     * @param col Column to convert.
      * @param colChg Column
      * @return ColumnChange to get result from.
      */
@@ -397,7 +400,7 @@ public class SchemaConfigurationConverter {
     /**
      * Convert table schema to table changer.
      *
-     * @param tbl    Table schema to convert.
+     * @param tbl Table schema to convert.
      * @param tblChg Change to fulfill.
      * @return TableChange to get result from.
      */
@@ -458,7 +461,7 @@ public class SchemaConfigurationConverter {
     /**
      * Create table.
      *
-     * @param tbl        Table to create.
+     * @param tbl Table to create.
      * @param tblsChange Tables change to fulfill.
      * @return TablesChange to get result from.
      */
@@ -469,7 +472,7 @@ public class SchemaConfigurationConverter {
     /**
      * Drop table.
      *
-     * @param tbl        table to drop.
+     * @param tbl table to drop.
      * @param tblsChange TablesChange change to fulfill.
      * @return TablesChange to get result from.
      */
@@ -480,7 +483,7 @@ public class SchemaConfigurationConverter {
     /**
      * Add index.
      *
-     * @param idx       Index to add.
+     * @param idx Index to add.
      * @param tableId Table id.
      * @param change Indexes change to fulfill.
      * @return TableChange to get result from.
@@ -492,7 +495,7 @@ public class SchemaConfigurationConverter {
     /**
      * Add table column.
      *
-     * @param column    Column to add.
+     * @param column Column to add.
      * @param tblChange TableChange to fulfill.
      * @return TableChange to get result from.
      */
@@ -504,7 +507,7 @@ public class SchemaConfigurationConverter {
      * Drop table column.
      *
      * @param columnName column name to drop.
-     * @param tblChange  TableChange to fulfill.
+     * @param tblChange TableChange to fulfill.
      * @return TableChange to get result from.
      */
     public static TableChange dropColumn(String columnName, TableChange tblChange) {
@@ -536,7 +539,7 @@ public class SchemaConfigurationConverter {
             case STRING:
             case UUID:
                 return defaultValue.toString();
-            case BLOB:
+            case BYTES:
                 return IgniteUtils.toHexString((byte[]) defaultValue);
             case BITMASK:
                 return IgniteUtils.toHexString(((BitSet) defaultValue).toByteArray());
@@ -577,7 +580,7 @@ public class SchemaConfigurationConverter {
                 return defaultValue;
             case UUID:
                 return UUID.fromString(defaultValue);
-            case BLOB:
+            case BYTES:
                 return IgniteUtils.fromHexString(defaultValue);
             case BITMASK:
                 return BitSet.valueOf(IgniteUtils.fromHexString(defaultValue));
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java
index ebb6d87a98..c2d6145ab0 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilder.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.schema.testutils.builder;
 
 import java.util.Map;
-import org.apache.ignite.schema.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
 import org.jetbrains.annotations.Nullable;
 
 /**
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java
index 2006d296fa..4467111479 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/ColumnDefinitionBuilderImpl.java
@@ -18,11 +18,11 @@
 package org.apache.ignite.internal.schema.testutils.builder;
 
 import java.util.Map;
-import org.apache.ignite.internal.schema.definition.ColumnDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.DefaultValueDefinition;
 import org.apache.ignite.internal.util.IgniteObjectName;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition;
 import org.jetbrains.annotations.Nullable;
 
 /**
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java
index e06cf58c0e..4e108bdfe1 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilder.java
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.schema.testutils.builder;
 
 import java.util.List;
 import java.util.Map;
-import org.apache.ignite.schema.definition.index.HashIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.HashIndexDefinition;
 
 /**
  * Hash index descriptor builder.
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java
index 487af48ea9..f76352707e 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/HashIndexDefinitionBuilderImpl.java
@@ -21,9 +21,9 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import org.apache.ignite.internal.schema.definition.index.HashIndexDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.index.HashIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.HashIndexDefinitionImpl;
 import org.apache.ignite.internal.util.IgniteObjectName;
-import org.apache.ignite.schema.definition.index.HashIndexDefinition;
 
 /**
  * Hash index builder.
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java
index 7b4ebca1f2..e3a3a6e092 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilder.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.schema.testutils.builder;
 
 import java.util.List;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.PrimaryKeyDefinition;
 
 /**
  * Hash index descriptor builder.
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java
index f7fa3b0f8e..17c82c2bf0 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/PrimaryKeyDefinitionBuilderImpl.java
@@ -22,11 +22,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
-import org.apache.ignite.internal.schema.definition.index.PrimaryKeyDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.PrimaryKeyDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.PrimaryKeyDefinitionImpl;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.util.CollectionUtils;
 import org.apache.ignite.internal.util.IgniteObjectName;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
 
 /**
  * Primary key builder.
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java
index ab83125180..43b93089a9 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SchemaBuilders.java
@@ -17,8 +17,9 @@
 
 package org.apache.ignite.internal.schema.testutils.builder;
 
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
+
+import org.apache.ignite.internal.schema.testutils.definition.ColumnType;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 
 /**
  * Schema builder helper.
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java
index a85b837817..c6e20391c5 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilder.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.schema.testutils.builder;
 
 import java.util.Map;
-import org.apache.ignite.schema.definition.index.SortedIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexDefinition;
 
 /**
  * Sorted index descriptor builder.
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java
index ad42cca1fc..ea178edb42 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/SortedIndexDefinitionBuilderImpl.java
@@ -21,12 +21,12 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import org.apache.ignite.internal.schema.definition.index.SortedIndexColumnDefinitionImpl;
-import org.apache.ignite.internal.schema.definition.index.SortedIndexDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortOrder;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexColumnDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexDefinitionImpl;
 import org.apache.ignite.internal.util.IgniteObjectName;
-import org.apache.ignite.schema.definition.index.SortOrder;
-import org.apache.ignite.schema.definition.index.SortedIndexColumnDefinition;
-import org.apache.ignite.schema.definition.index.SortedIndexDefinition;
 
 /**
  * Sorted index builder.
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java
index 30cb134ac3..5a616055b4 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilder.java
@@ -19,9 +19,9 @@ package org.apache.ignite.internal.schema.testutils.builder;
 
 import java.util.List;
 import java.util.Map;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
-import org.apache.ignite.schema.definition.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.PrimaryKeyDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
 
 /**
  * Table definition builder.
@@ -67,5 +67,6 @@ public interface TableDefinitionBuilder extends SchemaObjectBuilder {
      *
      * @return Table definition.
      */
-    @Override TableDefinition build();
+    @Override
+    TableDefinition build();
 }
diff --git a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java
index 9ed3dcbb86..cf74ed8c3d 100644
--- a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/builder/TableDefinitionBuilderImpl.java
@@ -21,12 +21,11 @@ import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.ignite.internal.schema.definition.SchemaValidationUtils;
-import org.apache.ignite.internal.schema.definition.TableDefinitionImpl;
+import org.apache.ignite.internal.schema.testutils.definition.ColumnDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.PrimaryKeyDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinitionImpl;
 import org.apache.ignite.internal.util.IgniteObjectName;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
-import org.apache.ignite.schema.definition.TableDefinition;
 
 /**
  * Table builder.
@@ -104,8 +103,6 @@ class TableDefinitionBuilderImpl implements TableDefinitionBuilder {
         assert primaryKeyDefinition != null : "Primary key index must be configured.";
         assert columns.size() > primaryKeyDefinition.columns().size() : "Key or/and value columns must be defined.";
 
-        SchemaValidationUtils.validatePrimaryKey(primaryKeyDefinition.columns(), columns);
-
         return new TableDefinitionImpl(
                 schemaName,
                 tableName,
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/AbstractSchemaObject.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/AbstractSchemaObject.java
similarity index 93%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/AbstractSchemaObject.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/AbstractSchemaObject.java
index 980039ee10..4a2700c7f8 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/AbstractSchemaObject.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/AbstractSchemaObject.java
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.SchemaObject;
 
 /**
  * Schema object base class.
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/ColumnDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnDefinition.java
similarity index 95%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/ColumnDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnDefinition.java
index 0d1670a481..b0e85326cc 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/ColumnDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 /**
  * Table column descriptor.
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/ColumnDefinitionImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnDefinitionImpl.java
similarity index 90%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/ColumnDefinitionImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnDefinitionImpl.java
index da154d0864..61df32a099 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/ColumnDefinitionImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnDefinitionImpl.java
@@ -15,12 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.DefaultValueDefinition;
 
 /**
  * Table column.
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/ColumnType.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnType.java
similarity index 98%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/ColumnType.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnType.java
index 9efc5200cf..9b75d8e738 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/ColumnType.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/ColumnType.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 import java.util.Objects;
 
@@ -94,7 +94,7 @@ public class ColumnType {
      * @return Blob type.
      */
     public static VarLenColumnType blobOf(int length) {
-        return new VarLenColumnType(ColumnTypeSpec.BLOB, length);
+        return new VarLenColumnType(ColumnTypeSpec.BYTES, length);
     }
 
     /**
@@ -258,7 +258,7 @@ public class ColumnType {
         private static final VarLenColumnType UNLIMITED_STRING = new VarLenColumnType(ColumnTypeSpec.STRING, 0);
 
         /** Blob varlen type of unlimited length. */
-        private static final VarLenColumnType UNLIMITED_BLOB = new VarLenColumnType(ColumnTypeSpec.BLOB, 0);
+        private static final VarLenColumnType UNLIMITED_BLOB = new VarLenColumnType(ColumnTypeSpec.BYTES, 0);
 
         /** Max length. */
         private final int length;
@@ -391,7 +391,7 @@ public class ColumnType {
      */
     public static class NumberColumnType extends ColumnType {
         /** Number type with unlimited precision. */
-        public static final NumberColumnType UNLIMITED_NUMBER = new NumberColumnType(ColumnTypeSpec.NUMBER, 0);
+        public static final NumberColumnType UNLIMITED_NUMBER = new NumberColumnType(ColumnTypeSpec.NUMBER, Integer.MAX_VALUE);
 
         /** Max precision of value. If -1, column has no precision restrictions. */
         private final int precision;
@@ -570,7 +570,7 @@ public class ColumnType {
         STRING,
 
         /** Binary data. */
-        BLOB,
+        BYTES,
 
         /** Number. */
         NUMBER,
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/DefaultValueDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/DefaultValueDefinition.java
similarity index 98%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/DefaultValueDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/DefaultValueDefinition.java
index 852f68cc10..7229e83f1b 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/DefaultValueDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/DefaultValueDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 import java.util.Objects;
 
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/DefaultValueGenerators.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/DefaultValueGenerators.java
similarity index 94%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/DefaultValueGenerators.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/DefaultValueGenerators.java
index 56add2f3a6..5f04536a55 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/DefaultValueGenerators.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/DefaultValueGenerators.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 /**
  * Enumeration of all supported value generators that could be used as a default value provider
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/PrimaryKeyDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/PrimaryKeyDefinition.java
similarity index 95%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/PrimaryKeyDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/PrimaryKeyDefinition.java
index ab98023f16..abf7300b0b 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/PrimaryKeyDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/PrimaryKeyDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 import java.util.List;
 import java.util.Set;
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/SchemaObject.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/SchemaObject.java
similarity index 95%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/SchemaObject.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/SchemaObject.java
index ab517286de..fde4656538 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/SchemaObject.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/SchemaObject.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 /**
  * Schema object.
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/TableDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/TableDefinition.java
similarity index 95%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/TableDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/TableDefinition.java
index f8f288f17d..683b278f56 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/TableDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/TableDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 import java.util.List;
 import java.util.Set;
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/TableDefinitionImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/TableDefinitionImpl.java
similarity index 93%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/TableDefinitionImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/TableDefinitionImpl.java
index 8e8b859915..971edb2f9b 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/TableDefinitionImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/TableDefinitionImpl.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition;
+package org.apache.ignite.internal.schema.testutils.definition;
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -23,9 +23,6 @@ import java.util.List;
 import java.util.Set;
 import org.apache.ignite.internal.schema.SchemaUtils;
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
-import org.apache.ignite.schema.definition.TableDefinition;
 
 /**
  * Table.
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/ColumnarIndexDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/ColumnarIndexDefinition.java
similarity index 94%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/ColumnarIndexDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/ColumnarIndexDefinition.java
index 8998a170cb..b7ee58fe22 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/ColumnarIndexDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/ColumnarIndexDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 import java.util.List;
 
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/HashIndexDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/HashIndexDefinition.java
similarity index 93%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/HashIndexDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/HashIndexDefinition.java
index 9d17d582c0..55ee4fe411 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/HashIndexDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/HashIndexDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 /**
  * Hash index descriptor.
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/HashIndexDefinitionImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/HashIndexDefinitionImpl.java
similarity index 85%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/HashIndexDefinitionImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/HashIndexDefinitionImpl.java
index 5ed2f08b20..1e9223a178 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/HashIndexDefinitionImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/HashIndexDefinitionImpl.java
@@ -15,15 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 import java.util.List;
 import java.util.stream.Collectors;
-import org.apache.ignite.internal.schema.definition.AbstractSchemaObject;
+import org.apache.ignite.internal.schema.testutils.definition.AbstractSchemaObject;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.index.HashIndexDefinition;
-import org.apache.ignite.schema.definition.index.IndexColumnDefinition;
 
 /**
  * Hash index.
@@ -36,7 +34,7 @@ public class HashIndexDefinitionImpl extends AbstractSchemaObject implements Has
     /**
      * Constructor.
      *
-     * @param name    Index name.
+     * @param name Index name.
      * @param columns Index columns.
      */
     public HashIndexDefinitionImpl(String name, List<String> columns) {
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/IndexColumnDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexColumnDefinition.java
similarity index 93%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/IndexColumnDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexColumnDefinition.java
index b7127f5494..e94026a6d9 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/IndexColumnDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexColumnDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 /**
  * Index column descriptor.
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/IndexColumnDefinitionImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexColumnDefinitionImpl.java
similarity index 79%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/IndexColumnDefinitionImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexColumnDefinitionImpl.java
index e7ef6c07ed..a10ddcd78e 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/IndexColumnDefinitionImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexColumnDefinitionImpl.java
@@ -15,16 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
-import org.apache.ignite.internal.schema.definition.AbstractSchemaObject;
+import org.apache.ignite.internal.schema.testutils.definition.AbstractSchemaObject;
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.index.IndexColumnDefinition;
 
 /**
  * Non-ordered index column.
  */
-class IndexColumnDefinitionImpl extends AbstractSchemaObject implements IndexColumnDefinition {
+public class IndexColumnDefinitionImpl extends AbstractSchemaObject implements IndexColumnDefinition {
     /**
      * Constructor.
      *
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/IndexDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexDefinition.java
similarity index 90%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/IndexDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexDefinition.java
index ad3b095735..7f2880ab17 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/IndexDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/IndexDefinition.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
-import org.apache.ignite.schema.definition.SchemaObject;
+import org.apache.ignite.internal.schema.testutils.definition.SchemaObject;
 
 /**
  * Index base interface.
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/PrimaryKeyDefinitionImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/PrimaryKeyDefinitionImpl.java
similarity index 92%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/PrimaryKeyDefinitionImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/PrimaryKeyDefinitionImpl.java
index eaaddc0584..2111d251e2 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/PrimaryKeyDefinitionImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/PrimaryKeyDefinitionImpl.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 import java.util.List;
 import java.util.Set;
-import org.apache.ignite.internal.schema.definition.AbstractSchemaObject;
+import org.apache.ignite.internal.schema.testutils.definition.AbstractSchemaObject;
+import org.apache.ignite.internal.schema.testutils.definition.PrimaryKeyDefinition;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.tostring.S;
 import org.apache.ignite.internal.util.CollectionUtils;
-import org.apache.ignite.schema.definition.PrimaryKeyDefinition;
 
 /**
  * Primary key index.
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortOrder.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortOrder.java
similarity index 93%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortOrder.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortOrder.java
index 1636ee8c20..4c56b08ace 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortOrder.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortOrder.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 /**
  * Index column sort order.
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortedIndexColumnDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexColumnDefinition.java
similarity index 93%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortedIndexColumnDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexColumnDefinition.java
index 32837b3015..785a65362e 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortedIndexColumnDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexColumnDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 /**
  * Sorted index column.
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/SortedIndexColumnDefinitionImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexColumnDefinitionImpl.java
similarity index 87%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/SortedIndexColumnDefinitionImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexColumnDefinitionImpl.java
index 6d7c244b4f..67acd4b7c0 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/SortedIndexColumnDefinitionImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexColumnDefinitionImpl.java
@@ -15,11 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.index.SortOrder;
-import org.apache.ignite.schema.definition.index.SortedIndexColumnDefinition;
 
 /**
  * Ordered index column.
@@ -34,7 +32,7 @@ public class SortedIndexColumnDefinitionImpl implements SortedIndexColumnDefinit
     /**
      * Constructor.
      *
-     * @param name      Column name.
+     * @param name Column name.
      * @param sortOrder Sort order flag.
      */
     public SortedIndexColumnDefinitionImpl(String name, SortOrder sortOrder) {
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortedIndexDefinition.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexDefinition.java
similarity index 94%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortedIndexDefinition.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexDefinition.java
index fb7c4ceba1..fc2ef4dad3 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/SortedIndexDefinition.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexDefinition.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 import java.util.List;
 
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/SortedIndexDefinitionImpl.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexDefinitionImpl.java
similarity index 85%
rename from modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/SortedIndexDefinitionImpl.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexDefinitionImpl.java
index 2f325117dd..9562a8cfd1 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/definition/index/SortedIndexDefinitionImpl.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/SortedIndexDefinitionImpl.java
@@ -15,15 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.schema.definition.index;
+package org.apache.ignite.internal.schema.testutils.definition.index;
 
 import java.util.Collections;
 import java.util.List;
-import org.apache.ignite.internal.schema.definition.AbstractSchemaObject;
+import org.apache.ignite.internal.schema.testutils.definition.AbstractSchemaObject;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.tostring.S;
-import org.apache.ignite.schema.definition.index.SortedIndexColumnDefinition;
-import org.apache.ignite.schema.definition.index.SortedIndexDefinition;
 
 /**
  * Sorted index.
@@ -39,8 +37,8 @@ public class SortedIndexDefinitionImpl extends AbstractSchemaObject implements S
     /**
      * Constructor.
      *
-     * @param name   Index name.
-     * @param cols   Index columns.
+     * @param name Index name.
+     * @param cols Index columns.
      * @param unique Unique flag.
      */
     public SortedIndexDefinitionImpl(String name, List<SortedIndexColumnDefinition> cols, boolean unique) {
diff --git a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/package-info.java b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/package-info.java
similarity index 92%
rename from modules/api/src/main/java/org/apache/ignite/schema/definition/index/package-info.java
rename to modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/package-info.java
index 1f2dd3f4e2..5c5f34a90f 100644
--- a/modules/api/src/main/java/org/apache/ignite/schema/definition/index/package-info.java
+++ b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/testutils/definition/index/package-info.java
@@ -19,4 +19,4 @@
  * Contains index definition interfaces.
  */
 
-package org.apache.ignite.schema.definition.index;
\ No newline at end of file
+package org.apache.ignite.internal.schema.testutils.definition.index;
\ No newline at end of file
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 5ff26fa0ec..c90cda813f 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,8 +19,6 @@ 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.schema.configuration.SchemaConfigurationConverter.convert;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convertDefaultToConfiguration;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
 import java.util.HashMap;
@@ -37,6 +35,7 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.configuration.schemas.table.ColumnChange;
+import org.apache.ignite.configuration.schemas.table.ColumnTypeChange;
 import org.apache.ignite.configuration.schemas.table.ColumnView;
 import org.apache.ignite.configuration.schemas.table.ConstantValueDefaultChange;
 import org.apache.ignite.configuration.schemas.table.FunctionCallDefaultChange;
@@ -47,7 +46,15 @@ import org.apache.ignite.configuration.schemas.table.SortedIndexChange;
 import org.apache.ignite.configuration.schemas.table.TableChange;
 import org.apache.ignite.configuration.schemas.table.TableIndexChange;
 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.SchemaUtils;
+import org.apache.ignite.internal.schema.TemporalNativeType;
+import org.apache.ignite.internal.schema.VarlenNativeType;
+import org.apache.ignite.internal.schema.configuration.ValueSerializationHelper;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AbstractTableDdlCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableAddCommand;
 import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableDropCommand;
@@ -332,7 +339,7 @@ public class DdlCommandHandler {
     }
 
     private void convertColumnDefinition(ColumnDefinition definition, ColumnChange columnChange) {
-        var columnType = IgniteTypeFactory.relDataTypeToColumnType(definition.type());
+        NativeType columnType = IgniteTypeFactory.relDataTypeToNative(definition.type());
 
         columnChange.changeType(columnTypeChange -> convert(columnType, columnTypeChange));
         columnChange.changeNullable(definition.nullable());
@@ -345,7 +352,7 @@ public class DdlCommandHandler {
 
                     if (val != null) {
                         defaultChange.convert(ConstantValueDefaultChange.class)
-                                .changeDefaultValue(convertDefaultToConfiguration(val, columnType));
+                                .changeDefaultValue(ValueSerializationHelper.toString(val, columnType));
                     } else {
                         defaultChange.convert(NullValueDefaultChange.class);
                     }
@@ -409,6 +416,68 @@ public class DdlCommandHandler {
                 .thenApply(v -> ret.get());
     }
 
+    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());
+        }
+    }
+
     /** Map column name to order. */
     private static Map<String, String> columnOrdersToNames(NamedListView<? extends ColumnView> cols) {
         Map<String, String> colNames = new HashMap<>(cols.size());
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DefaultValueDefinition.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DefaultValueDefinition.java
index 0a00cb95bb..c10aa625bd 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DefaultValueDefinition.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DefaultValueDefinition.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.sql.engine.prepare.ddl;
 
 import java.util.Objects;
-import org.apache.ignite.schema.definition.DefaultValueGenerators;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -31,7 +30,6 @@ public class DefaultValueDefinition {
      *
      * @param name Name of the function to invoke to generate the value
      * @return Default value definition.
-     * @see DefaultValueGenerators
      */
     public static DefaultValueDefinition functionCall(String name) {
         return new FunctionCall(Objects.requireNonNull(name, "name"));
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelper.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelper.java
index b2dcc60517..5d1e5e4847 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelper.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelper.java
@@ -17,11 +17,10 @@
 
 package org.apache.ignite.internal.sql.engine.property;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
-import org.apache.ignite.internal.sql.engine.QueryProperty;
+import org.apache.ignite.internal.util.IgniteUtils;
 
 
 /**
@@ -36,24 +35,14 @@ public final class PropertiesHelper {
      * @param cls The class for property lookup.
      * @return A mapping name to property itself.
      */
+    @SuppressWarnings("rawtypes")
     public static Map<String, Property<?>> createPropsByNameMap(Class<?> cls) {
+        List<Property> properties = IgniteUtils.collectStaticFields(cls, Property.class);
+
         Map<String, Property<?>> tmp = new HashMap<>();
 
-        for (Field f : cls.getDeclaredFields()) {
-            if (!Property.class.equals(f.getType())
-                    || !Modifier.isStatic(f.getModifiers())
-                    || !Modifier.isPublic(f.getModifiers())) {
-                continue;
-            }
-
-            try {
-                Property<?> prop = (Property<?>) f.get(QueryProperty.class);
-
-                tmp.put(prop.name, prop);
-            } catch (IllegalAccessException e) {
-                // should not happen
-                throw new AssertionError(e);
-            }
+        for (Property<?> property : properties) {
+            tmp.put(property.name, property);
         }
 
         return Map.copyOf(tmp);
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
index b9055b2e21..703b917e99 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeFactory.java
@@ -44,7 +44,8 @@ import org.apache.calcite.sql.SqlUtil;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.calcite.sql.type.BasicSqlType;
 import org.apache.calcite.sql.type.IntervalSqlType;
-import org.apache.ignite.schema.definition.ColumnType;
+import org.apache.ignite.internal.schema.NativeType;
+import org.apache.ignite.internal.schema.NativeTypes;
 
 /**
  * Ignite type factory.
@@ -166,7 +167,7 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl {
      * @param relType Rel type.
      * @return ColumnType type or null.
      */
-    public static ColumnType relDataTypeToColumnType(RelDataType relType) {
+    public static NativeType relDataTypeToNative(RelDataType relType) {
         assert relType instanceof BasicSqlType
                 || relType instanceof IntervalSqlType : "Not supported.";
 
@@ -175,34 +176,34 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl {
                 //TODO: https://issues.apache.org/jira/browse/IGNITE-17298
                 throw new IllegalArgumentException("Type is not supported yet.");
             case TINYINT:
-                return ColumnType.INT8;
+                return NativeTypes.INT8;
             case SMALLINT:
-                return ColumnType.INT16;
+                return NativeTypes.INT16;
             case INTEGER:
-                return ColumnType.INT32;
+                return NativeTypes.INT32;
             case BIGINT:
-                return ColumnType.INT64;
+                return NativeTypes.INT64;
             case DECIMAL:
                 assert relType.getPrecision() != PRECISION_NOT_SPECIFIED;
 
-                return ColumnType.decimalOf(relType.getPrecision(), relType.getScale());
+                return NativeTypes.decimalOf(relType.getPrecision(), relType.getScale());
             case FLOAT:
             case REAL:
-                return ColumnType.FLOAT;
+                return NativeTypes.FLOAT;
             case DOUBLE:
-                return ColumnType.DOUBLE;
+                return NativeTypes.DOUBLE;
             case DATE:
-                return ColumnType.DATE;
+                return NativeTypes.DATE;
             case TIME:
             case TIME_WITH_LOCAL_TIME_ZONE:
-                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? ColumnType.time() :
-                        ColumnType.time(relType.getPrecision());
+                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? NativeTypes.time() :
+                        NativeTypes.time(relType.getPrecision());
             case TIMESTAMP:
-                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? ColumnType.datetime() :
-                        ColumnType.datetime(relType.getPrecision());
+                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? NativeTypes.datetime() :
+                        NativeTypes.datetime(relType.getPrecision());
             case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
-                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? ColumnType.timestamp() :
-                        ColumnType.timestamp(relType.getPrecision());
+                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? NativeTypes.timestamp() :
+                        NativeTypes.timestamp(relType.getPrecision());
             case INTERVAL_YEAR:
             case INTERVAL_YEAR_MONTH:
             case INTERVAL_MONTH:
@@ -222,12 +223,14 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl {
                 throw new IllegalArgumentException("Type is not supported yet.");
             case VARCHAR:
             case CHAR:
-                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? ColumnType.string() :
-                        ColumnType.stringOf(relType.getPrecision());
+                return relType.getPrecision() == PRECISION_NOT_SPECIFIED
+                        ? NativeTypes.stringOf(Integer.MAX_VALUE)
+                        : NativeTypes.stringOf(relType.getPrecision());
             case BINARY:
             case VARBINARY:
-                return relType.getPrecision() == PRECISION_NOT_SPECIFIED ? ColumnType.blob() :
-                        ColumnType.blobOf(relType.getPrecision());
+                return relType.getPrecision() == PRECISION_NOT_SPECIFIED
+                        ? NativeTypes.blobOf(Integer.MAX_VALUE)
+                        : NativeTypes.blobOf(relType.getPrecision());
             default:
                 throw new IllegalArgumentException("Type is not supported.");
         }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java
index 12ba7258bb..9a86cc4377 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/type/IgniteTypeSystem.java
@@ -25,7 +25,7 @@ import org.apache.calcite.rel.type.RelDataTypeSystem;
 import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
 import org.apache.calcite.sql.type.BasicSqlType;
 import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.ignite.schema.definition.ColumnType.TemporalColumnType;
+import org.apache.ignite.internal.schema.TemporalNativeType;
 
 /**
  * Ignite type system.
@@ -53,7 +53,7 @@ public class IgniteTypeSystem extends RelDataTypeSystemImpl implements Serializa
             case TIME_WITH_LOCAL_TIME_ZONE:
             case TIMESTAMP:
             case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
-                return TemporalColumnType.MAX_TIME_PRECISION;
+                return TemporalNativeType.MAX_TIME_PRECISION;
             default:
                 return super.getMaxPrecision(typeName);
         }
@@ -65,7 +65,7 @@ public class IgniteTypeSystem extends RelDataTypeSystemImpl implements Serializa
         switch (typeName) {
             case TIMESTAMP: // DATETIME
             case TIMESTAMP_WITH_LOCAL_TIME_ZONE: // TIMESTAMP
-                return TemporalColumnType.DEFAULT_TIMESTAMP_PRECISION;
+                return TemporalNativeType.DEFAULT_TIMESTAMP_PRECISION;
             default:
                 return super.getDefaultPrecision(typeName);
         }
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelperTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelperTest.java
index 986a76a2bd..5a1e0977a9 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelperTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/property/PropertiesHelperTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.Test;
 class PropertiesHelperTest {
     private static final String NON_STATIC_PROP_NAME = "non_static_prop";
 
-    static class TestProps {
+    public static class TestProps {
         public static final Property<Long> LONG_PROP = new Property<>("long_prop", Long.class);
         public static final Property<String> STRING_PROP = new Property<>("string_prop", String.class);
         private static final Property<String> PRIVATE_PROP = new Property<>("private_prop", String.class);
diff --git a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexDescriptor.java b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexDescriptor.java
index b1bc14a6a5..e3740ccdfd 100644
--- a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexDescriptor.java
+++ b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexDescriptor.java
@@ -29,8 +29,7 @@ import org.apache.ignite.configuration.schemas.table.TableView;
 import org.apache.ignite.configuration.schemas.table.TablesView;
 import org.apache.ignite.internal.configuration.util.ConfigurationUtil;
 import org.apache.ignite.internal.schema.NativeType;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.configuration.SchemaDescriptorConverter;
+import org.apache.ignite.internal.schema.configuration.ConfigurationToSchemaDescriptorConverter;
 import org.apache.ignite.internal.storage.StorageException;
 import org.apache.ignite.internal.tostring.S;
 
@@ -52,7 +51,7 @@ public class HashIndexDescriptor {
 
         ColumnDescriptor(ColumnView tableColumnView) {
             this.name = tableColumnView.name();
-            this.type = SchemaDescriptorConverter.convert(SchemaConfigurationConverter.convert(tableColumnView.type()));
+            this.type = ConfigurationToSchemaDescriptorConverter.convert(tableColumnView.type());
             this.nullable = tableColumnView.nullable();
         }
 
diff --git a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexStorage.java b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexStorage.java
index 4438be5423..e6f531fc98 100644
--- a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexStorage.java
+++ b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/HashIndexStorage.java
@@ -29,8 +29,6 @@ import org.apache.ignite.internal.util.Cursor;
  *
  * <p>This storage serves as an unordered mapping from a subset of a table's columns (a.k.a. index columns) to a set of {@link RowId}s
  * from a single {@link org.apache.ignite.internal.storage.MvPartitionStorage} from the same table.
- *
- * @see org.apache.ignite.schema.definition.index.HashIndexDefinition
  */
 public interface HashIndexStorage {
     /**
diff --git a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexDescriptor.java b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexDescriptor.java
index d59cc1305f..a278f114de 100644
--- a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexDescriptor.java
+++ b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexDescriptor.java
@@ -32,8 +32,7 @@ import org.apache.ignite.internal.configuration.util.ConfigurationUtil;
 import org.apache.ignite.internal.schema.BinaryTupleSchema;
 import org.apache.ignite.internal.schema.BinaryTupleSchema.Element;
 import org.apache.ignite.internal.schema.NativeType;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
-import org.apache.ignite.internal.schema.configuration.SchemaDescriptorConverter;
+import org.apache.ignite.internal.schema.configuration.ConfigurationToSchemaDescriptorConverter;
 import org.apache.ignite.internal.storage.StorageException;
 import org.apache.ignite.internal.tostring.S;
 
@@ -78,7 +77,7 @@ public class SortedIndexDescriptor {
          */
         public ColumnDescriptor(ColumnView tableColumnView, IndexColumnView indexColumnView) {
             this.name = tableColumnView.name();
-            this.type = SchemaDescriptorConverter.convert(SchemaConfigurationConverter.convert(tableColumnView.type()));
+            this.type = ConfigurationToSchemaDescriptorConverter.convert(tableColumnView.type());
             this.nullable = tableColumnView.nullable();
             this.asc = indexColumnView.asc();
         }
diff --git a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexStorage.java b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexStorage.java
index 6e615b3729..79ab7a4d89 100644
--- a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexStorage.java
+++ b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/index/SortedIndexStorage.java
@@ -28,8 +28,6 @@ import org.jetbrains.annotations.Nullable;
  *
  * <p>This storage serves as a sorted mapping from a subset of a table's columns (a.k.a. index columns) to a set of {@link RowId}s
  * from a single {@link org.apache.ignite.internal.storage.MvPartitionStorage} from the same table.
- *
- * @see org.apache.ignite.schema.definition.index.SortedIndexDefinition
  */
 public interface SortedIndexStorage {
     /** Exclude lower bound. */
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/AbstractSortedIndexStorageTest.java b/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/AbstractSortedIndexStorageTest.java
index 605b77619d..dce0ebcc01 100644
--- a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/AbstractSortedIndexStorageTest.java
+++ b/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/index/AbstractSortedIndexStorageTest.java
@@ -19,8 +19,8 @@ package org.apache.ignite.internal.storage.index;
 
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toUnmodifiableList;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.addIndex;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.addIndex;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders.column;
 import static org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders.tableBuilder;
 import static org.apache.ignite.internal.storage.index.SortedIndexStorage.GREATER;
@@ -59,6 +59,11 @@ import org.apache.ignite.internal.schema.SchemaTestUtils;
 import org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders;
 import org.apache.ignite.internal.schema.testutils.builder.SortedIndexDefinitionBuilder;
 import org.apache.ignite.internal.schema.testutils.builder.SortedIndexDefinitionBuilder.SortedIndexColumnBuilder;
+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.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.ColumnarIndexDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.SortedIndexDefinition;
 import org.apache.ignite.internal.storage.MvPartitionStorage;
 import org.apache.ignite.internal.storage.RowId;
 import org.apache.ignite.internal.storage.engine.MvTableStorage;
@@ -67,11 +72,6 @@ import org.apache.ignite.internal.storage.index.impl.BinaryTupleRowSerializer;
 import org.apache.ignite.internal.storage.index.impl.TestIndexRow;
 import org.apache.ignite.internal.testframework.VariableSource;
 import org.apache.ignite.internal.util.Cursor;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.schema.definition.index.ColumnarIndexDefinition;
-import org.apache.ignite.schema.definition.index.SortedIndexDefinition;
 import org.intellij.lang.annotations.MagicConstant;
 import org.jetbrains.annotations.Nullable;
 import org.junit.jupiter.api.RepeatedTest;
diff --git a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java
index ed8df0b8c7..f5b6896c50 100644
--- a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java
+++ b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvTableStorageTest.java
@@ -41,15 +41,15 @@ import org.apache.ignite.internal.schema.BinaryTuple;
 import org.apache.ignite.internal.schema.BinaryTupleSchema;
 import org.apache.ignite.internal.schema.BinaryTupleSchema.Element;
 import org.apache.ignite.internal.schema.NativeTypes;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 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.schema.testutils.definition.index.IndexDefinition;
 import org.apache.ignite.internal.storage.engine.MvTableStorage;
 import org.apache.ignite.internal.storage.index.HashIndexStorage;
 import org.apache.ignite.internal.storage.index.IndexRowImpl;
 import org.apache.ignite.internal.util.Cursor;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.schema.definition.index.IndexDefinition;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java
index 6c7996a851..003aac6d35 100644
--- a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java
+++ b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/index/AbstractHashIndexStorageTest.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.internal.storage.index;
 
 import static java.util.stream.Collectors.toList;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.addIndex;
-import static org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter.convert;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.addIndex;
+import static org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter.convert;
 import static org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders.column;
 import static org.apache.ignite.internal.schema.testutils.builder.SchemaBuilders.tableBuilder;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
@@ -38,15 +38,15 @@ import org.apache.ignite.configuration.schemas.table.TableIndexView;
 import org.apache.ignite.configuration.schemas.table.TablesConfiguration;
 import org.apache.ignite.internal.configuration.util.ConfigurationUtil;
 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;
+import org.apache.ignite.internal.schema.testutils.definition.TableDefinition;
+import org.apache.ignite.internal.schema.testutils.definition.index.HashIndexDefinition;
 import org.apache.ignite.internal.storage.MvPartitionStorage;
 import org.apache.ignite.internal.storage.RowId;
 import org.apache.ignite.internal.storage.engine.MvTableStorage;
 import org.apache.ignite.internal.storage.index.impl.BinaryTupleRowSerializer;
 import org.apache.ignite.internal.util.Cursor;
-import org.apache.ignite.schema.definition.ColumnDefinition;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
-import org.apache.ignite.schema.definition.index.HashIndexDefinition;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/MutableRowTupleAdapterTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/MutableRowTupleAdapterTest.java
index 5cae5b7436..05ac2df910 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/MutableRowTupleAdapterTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/MutableRowTupleAdapterTest.java
@@ -61,9 +61,9 @@ import org.apache.ignite.internal.schema.marshaller.TupleMarshaller;
 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.definition.ColumnType;
 import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
-import org.apache.ignite.schema.definition.ColumnType;
 import org.apache.ignite.table.Tuple;
 import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Test;
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 fc25f6fc97..9f57fa586e 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
@@ -94,9 +94,11 @@ import org.apache.ignite.internal.raft.storage.impl.LocalLogStorageFactory;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.schema.SchemaManager;
 import org.apache.ignite.internal.schema.SchemaUtils;
-import org.apache.ignite.internal.schema.configuration.SchemaConfigurationConverter;
 import org.apache.ignite.internal.schema.marshaller.schema.SchemaSerializerImpl;
+import org.apache.ignite.internal.schema.testutils.SchemaConfigurationConverter;
 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.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModules;
 import org.apache.ignite.internal.storage.rocksdb.RocksDbDataStorageModule;
@@ -125,8 +127,6 @@ import org.apache.ignite.raft.jraft.entity.PeerId;
 import org.apache.ignite.raft.jraft.error.RaftError;
 import org.apache.ignite.raft.jraft.rpc.CliRequests;
 import org.apache.ignite.raft.jraft.rpc.impl.RaftGroupServiceImpl;
-import org.apache.ignite.schema.definition.ColumnType;
-import org.apache.ignite.schema.definition.TableDefinition;
 import org.apache.ignite.table.Table;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;