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

amashenkov 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 2fcc41ef00f IGNITE-26840 Catalog. Migrate rest of the code from name 
to column id (#7465)
2fcc41ef00f is described below

commit 2fcc41ef00fadf4e4cc4a3d06ab4f11e9b66f87a
Author: Andrew V. Mashenkov <[email protected]>
AuthorDate: Tue Jan 27 16:01:07 2026 +0300

    IGNITE-26840 Catalog. Migrate rest of the code from name to column id 
(#7465)
---
 .../commands/AbstractCreateIndexCommand.java       |   2 +-
 .../internal/catalog/commands/CatalogUtils.java    |  22 +++-
 .../descriptors/CatalogTableDescriptor.java        |  16 +++
 .../CatalogTableDescriptorSerializers.java         | 133 ++++-----------------
 .../systemviews/TablesSystemViewProvider.java      |  13 +-
 .../ignite/internal/catalog/CatalogTableTest.java  |   8 +-
 .../descriptors/CatalogTableDescriptorTest.java    |   4 +-
 .../handler/requests/jdbc/JdbcMetadataCatalog.java |   3 +-
 .../ignite/internal/schema/SchemaDescriptor.java   | 129 +++++++++-----------
 .../CatalogToSchemaDescriptorConverter.java        |  10 +-
 .../sql/engine/schema/SqlSchemaManagerImpl.java    |  33 ++---
 .../prepare/ddl/DdlSqlToCommandConverterTest.java  |  17 +--
 12 files changed, 154 insertions(+), 236 deletions(-)

diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
index db797e1dc65..1208e63e46e 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AbstractCreateIndexCommand.java
@@ -98,7 +98,7 @@ public abstract class AbstractCreateIndexCommand extends 
AbstractIndexCommand {
             }
         }
 
-        if (unique && !new 
HashSet<>(columns).containsAll(table.colocationColumnNames())) {
+        if (unique && !new 
HashSet<>(columns).containsAll(CatalogUtils.resolveColumnNames(table, 
table.colocationColumns()))) {
             throw new CatalogValidationException("Unique index must include 
all colocation columns.");
         }
 
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index b45fbfde2fb..e02ed7994c5 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -61,7 +61,7 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Catalog utils.
  */
-public class CatalogUtils {
+public final class CatalogUtils {
     /** Default zone name. */
     public static final String DEFAULT_ZONE_NAME = "Default";
 
@@ -967,4 +967,24 @@ public class CatalogUtils {
 
         return names;
     }
+
+    /**
+     * Return column positions in the table descriptor for the given column 
IDs.
+     */
+    public static int[] resolveColumnIndexesByIds(CatalogTableDescriptor 
descriptor, IntList columnIds) {
+        int[] columnIdxs = new int[columnIds.size()];
+
+        for (int i = 0; i < columnIds.size(); i++) {
+            int colId = columnIds.getInt(i);
+            int colIdx = descriptor.columnIndexById(colId);
+            columnIdxs[i] = colIdx;
+        }
+
+        return columnIdxs;
+    }
+
+    // Private constructor to prevent instantiation
+    private CatalogUtils() {
+
+    }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java
index b1b90e93804..3736a6ce5be 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptor.java
@@ -190,6 +190,7 @@ public class CatalogTableDescriptor extends 
CatalogObjectDescriptor implements M
     /**
      * Returns a list primary key column names.
      */
+    @Deprecated
     public List<String> primaryKeyColumnNames() {
         // TODO: https://issues.apache.org/jira/browse/IGNITE-26840
         return resolveColumnNames(this, primaryKeyColumns);
@@ -198,11 +199,26 @@ public class CatalogTableDescriptor extends 
CatalogObjectDescriptor implements M
     /**
      * Returns a list colocation key column names.
      */
+    @Deprecated
     public List<String> colocationColumnNames() {
         // TODO: https://issues.apache.org/jira/browse/IGNITE-26840
         return resolveColumnNames(this, colocationColumns);
     }
 
+    /**
+     * Returns a list of primary key column IDs.
+     */
+    public IntList primaryKeyColumns() {
+        return primaryKeyColumns;
+    }
+
+    /**
+     * Returns a list of colocation key column IDs.
+     */
+    public IntList colocationColumns() {
+        return colocationColumns;
+    }
+
     /** {@inheritDoc} */
     @Override
     public List<CatalogTableColumnDescriptor> columns() {
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java
index e2a8fd4b703..d881d78f433 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorSerializers.java
@@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntList;
 import java.io.IOException;
 import java.util.List;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
 import 
org.apache.ignite.internal.catalog.storage.serialization.CatalogEntrySerializerProvider;
 import 
org.apache.ignite.internal.catalog.storage.serialization.CatalogObjectDataInput;
 import 
org.apache.ignite.internal.catalog.storage.serialization.CatalogObjectDataOutput;
@@ -88,13 +89,8 @@ public class CatalogTableDescriptorSerializers {
             if (colocationColumnsLen == -1) {
                 colocationColumns = primaryKeyColumns;
             } else {
-                colocationColumns = new IntArrayList(colocationColumnsLen);
-
                 int[] colocationColumnIdxs = 
input.readIntArray(colocationColumnsLen);
-
-                for (int idx : colocationColumnIdxs) {
-                    colocationColumns.add(columns.get(idx).id());
-                }
+                colocationColumns = resolveColumnIdsByIndexes(columns, 
colocationColumnIdxs);
             }
 
             return CatalogTableDescriptor.builder()
@@ -130,65 +126,20 @@ public class CatalogTableDescriptorSerializers {
             output.writeVarInt(descriptor.primaryKeyIndexId());
             output.writeVarInt(descriptor.zoneId());
 
-            int[] pkIndexes = resolvePkColumnIndexes(descriptor);
+            int[] pkIndexes = 
CatalogUtils.resolveColumnIndexesByIds(descriptor, 
descriptor.primaryKeyColumns());
 
             output.writeVarInt(pkIndexes.length);
             output.writeIntArray(pkIndexes);
 
-            if (descriptor.colocationColumnNames() == 
descriptor.primaryKeyColumnNames()) {
+            if (descriptor.colocationColumns() == 
descriptor.primaryKeyColumns()) {
                 output.writeVarInt(-1);
             } else {
-                int[] colocationIndexes = 
resolveColocationColumnIndexes(pkIndexes, descriptor);
+                int[] colocationIndexes = 
CatalogUtils.resolveColumnIndexesByIds(descriptor, 
descriptor.colocationColumns());
 
                 output.writeVarInt(colocationIndexes.length);
                 output.writeIntArray(colocationIndexes);
             }
         }
-
-        private static int[] resolveColocationColumnIndexes(int[] 
pkColumnIndexes, CatalogTableDescriptor descriptor) {
-            int[] colocationColumnIndexes = new 
int[descriptor.colocationColumnNames().size()];
-
-            for (int idx : pkColumnIndexes) {
-                String columnName = descriptor.columns().get(idx).name();
-
-                for (int j = 0; j < descriptor.colocationColumnNames().size(); 
j++) {
-                    if 
(descriptor.colocationColumnNames().get(j).equals(columnName)) {
-                        colocationColumnIndexes[j] = idx;
-
-                        break;
-                    }
-                }
-            }
-
-            return colocationColumnIndexes;
-        }
-
-        private static int[] resolvePkColumnIndexes(CatalogTableDescriptor 
descriptor) {
-            List<CatalogTableColumnDescriptor> columns = descriptor.columns();
-            List<String> pkColumns = descriptor.primaryKeyColumnNames();
-
-            assert columns.size() >= pkColumns.size();
-
-            int[] pkColumnIndexes = new int[pkColumns.size()];
-            int foundCount = 0;
-
-            for (int i = 0; i < columns.size() && foundCount < 
pkColumnIndexes.length; i++) {
-                for (int j = 0; j < pkColumns.size(); j++) {
-                    String pkColumn = pkColumns.get(j);
-
-                    if (pkColumn.equals(columns.get(i).name())) {
-                        pkColumnIndexes[j] = i;
-                        foundCount++;
-
-                        break;
-                    }
-                }
-            }
-
-            assert foundCount == pkColumnIndexes.length;
-
-            return pkColumnIndexes;
-        }
     }
 
     /**
@@ -230,13 +181,8 @@ public class CatalogTableDescriptorSerializers {
             if (colocationColumnsLen == -1) {
                 colocationColumns = primaryKeyColumns;
             } else {
-                colocationColumns = new IntArrayList(colocationColumnsLen);
-
                 int[] colocationColumnIdxs = 
input.readIntArray(colocationColumnsLen);
-
-                for (int idx : colocationColumnIdxs) {
-                    colocationColumns.add(columns.get(idx).id());
-                }
+                colocationColumns = resolveColumnIdsByIndexes(columns, 
colocationColumnIdxs);
             }
 
             return CatalogTableDescriptor.builder()
@@ -267,15 +213,15 @@ public class CatalogTableDescriptorSerializers {
             output.writeVarInt(descriptor.primaryKeyIndexId());
             output.writeVarInt(descriptor.zoneId());
 
-            int[] pkIndexes = resolvePkColumnIndexes(descriptor);
+            int[] pkIndexes = 
CatalogUtils.resolveColumnIndexesByIds(descriptor, 
descriptor.primaryKeyColumns());
 
             output.writeVarInt(pkIndexes.length);
             output.writeIntArray(pkIndexes);
 
-            if (descriptor.colocationColumnNames() == 
descriptor.primaryKeyColumnNames()) {
+            if (descriptor.colocationColumns() == 
descriptor.primaryKeyColumns()) {
                 output.writeVarInt(-1);
             } else {
-                int[] colocationIndexes = 
resolveColocationColumnIndexes(pkIndexes, descriptor);
+                int[] colocationIndexes = 
CatalogUtils.resolveColumnIndexesByIds(descriptor, 
descriptor.colocationColumns());
 
                 output.writeVarInt(colocationIndexes.length);
                 output.writeIntArray(colocationIndexes);
@@ -318,13 +264,8 @@ public class CatalogTableDescriptorSerializers {
             if (colocationColumnsLen == -1) {
                 colocationColumns = primaryKeyColumns;
             } else {
-                colocationColumns = new IntArrayList(colocationColumnsLen);
-
                 int[] colocationColumnIdxs = 
input.readIntArray(colocationColumnsLen);
-
-                for (int idx : colocationColumnIdxs) {
-                    colocationColumns.add(columns.get(idx).id());
-                }
+                colocationColumns = resolveColumnIdsByIndexes(columns, 
colocationColumnIdxs);
             }
 
             double staleRowsFraction = input.readDouble();
@@ -359,15 +300,15 @@ public class CatalogTableDescriptorSerializers {
             output.writeVarInt(descriptor.primaryKeyIndexId());
             output.writeVarInt(descriptor.zoneId());
 
-            int[] pkIndexes = resolvePkColumnIndexes(descriptor);
+            int[] pkIndexes = 
CatalogUtils.resolveColumnIndexesByIds(descriptor, 
descriptor.primaryKeyColumns());
 
             output.writeVarInt(pkIndexes.length);
             output.writeIntArray(pkIndexes);
 
-            if (descriptor.colocationColumnNames() == 
descriptor.primaryKeyColumnNames()) {
+            if (descriptor.colocationColumns() == 
descriptor.primaryKeyColumns()) {
                 output.writeVarInt(-1);
             } else {
-                int[] colocationIndexes = 
resolveColocationColumnIndexes(pkIndexes, descriptor);
+                int[] colocationIndexes = 
CatalogUtils.resolveColumnIndexesByIds(descriptor, 
descriptor.colocationColumns());
 
                 output.writeVarInt(colocationIndexes.length);
                 output.writeIntArray(colocationIndexes);
@@ -378,48 +319,16 @@ public class CatalogTableDescriptorSerializers {
         }
     }
 
-    private static int[] resolveColocationColumnIndexes(int[] pkColumnIndexes, 
CatalogTableDescriptor descriptor) {
-        int[] colocationColumnIndexes = new 
int[descriptor.colocationColumnNames().size()];
-
-        for (int idx : pkColumnIndexes) {
-            String columnName = descriptor.columns().get(idx).name();
-
-            for (int j = 0; j < descriptor.colocationColumnNames().size(); 
j++) {
-                if 
(descriptor.colocationColumnNames().get(j).equals(columnName)) {
-                    colocationColumnIndexes[j] = idx;
-
-                    break;
-                }
-            }
-        }
-
-        return colocationColumnIndexes;
-    }
-
-    private static int[] resolvePkColumnIndexes(CatalogTableDescriptor 
descriptor) {
-        List<CatalogTableColumnDescriptor> columns = descriptor.columns();
-        List<String> pkColumns = descriptor.primaryKeyColumnNames();
-
-        assert columns.size() >= pkColumns.size();
-
-        int[] pkColumnIndexes = new int[pkColumns.size()];
-        int foundCount = 0;
-
-        for (int i = 0; i < columns.size() && foundCount < 
pkColumnIndexes.length; i++) {
-            for (int j = 0; j < pkColumns.size(); j++) {
-                String pkColumn = pkColumns.get(j);
-
-                if (pkColumn.equals(columns.get(i).name())) {
-                    pkColumnIndexes[j] = i;
-                    foundCount++;
+    /**
+     * Return column IDs for the given column positions in columns list.
+     */
+    private static IntList 
resolveColumnIdsByIndexes(List<CatalogTableColumnDescriptor> columns, int[] 
indexes) {
+        IntList columnIds = new IntArrayList(indexes.length);
 
-                    break;
-                }
-            }
+        for (int idx : indexes) {
+            columnIds.add(columns.get(idx).id());
         }
 
-        assert foundCount == pkColumnIndexes.length;
-
-        return pkColumnIndexes;
+        return columnIds;
     }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
index 25088dc1f98..e8a03f814e6 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/TablesSystemViewProvider.java
@@ -27,6 +27,7 @@ import java.util.concurrent.Flow.Publisher;
 import java.util.function.Supplier;
 import org.apache.ignite.internal.catalog.Catalog;
 import org.apache.ignite.internal.catalog.CatalogSystemViewProvider;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
 import org.apache.ignite.internal.systemview.api.SystemView;
@@ -75,7 +76,8 @@ public class TablesSystemViewProvider implements 
CatalogSystemViewProvider {
                 .addColumn("TABLE_PK_INDEX_ID", INT32, entry -> 
entry.table.primaryKeyIndexId())
                 .addColumn("ZONE_NAME", STRING, entry -> entry.zoneName)
                 .addColumn("STORAGE_PROFILE", STRING, entry -> 
entry.table.storageProfile())
-                .addColumn("TABLE_COLOCATION_COLUMNS", STRING, entry -> 
concatColumns(entry.table.colocationColumnNames()))
+                .addColumn("TABLE_COLOCATION_COLUMNS", STRING, entry ->
+                        
concatColumns(CatalogUtils.resolveColumnNames(entry.table, 
entry.table.colocationColumns())))
                 .addColumn("SCHEMA_ID", INT32, entry -> entry.table.schemaId())
                 .addColumn("ZONE_ID", INT32, entry -> entry.table.zoneId())
                 // TODO https://issues.apache.org/jira/browse/IGNITE-24589: 
Next columns are deprecated and should be removed.
@@ -84,7 +86,8 @@ public class TablesSystemViewProvider implements 
CatalogSystemViewProvider {
                 .addColumn("NAME", STRING, entry -> entry.table.name())
                 .addColumn("ID", INT32, entry -> entry.table.id())
                 .addColumn("PK_INDEX_ID", INT32, entry -> 
entry.table.primaryKeyIndexId())
-                .addColumn("COLOCATION_KEY_INDEX", STRING, entry -> 
concatColumns(entry.table.colocationColumnNames()))
+                .addColumn("COLOCATION_KEY_INDEX", STRING, entry ->
+                        
concatColumns(CatalogUtils.resolveColumnNames(entry.table, 
entry.table.colocationColumns())))
                 .addColumn("ZONE", STRING, entry -> entry.zoneName)
                 .dataProvider(viewDataPublisher)
                 .build();
@@ -162,16 +165,16 @@ public class TablesSystemViewProvider implements 
CatalogSystemViewProvider {
         }
 
         int columnOrdinal() {
-            return tableDescriptor.columnIndex(columnDescriptor.name());
+            return tableDescriptor.columnIndexById(columnDescriptor.id());
         }
 
         @Nullable Integer pkColumnOrdinal() {
-            int idx = 
tableDescriptor.primaryKeyColumnNames().indexOf(columnDescriptor.name());
+            int idx = 
tableDescriptor.primaryKeyColumns().indexOf(columnDescriptor.id());
             return idx >= 0 ? idx : null;
         }
 
         @Nullable Integer colocationColumnOrdinal() {
-            int idx = 
tableDescriptor.colocationColumnNames().indexOf(columnDescriptor.name());
+            int idx = 
tableDescriptor.colocationColumns().indexOf(columnDescriptor.id());
             return idx >= 0 ? idx : null;
         }
     }
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java
index 1ba22e87093..6a0b7428595 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogTableTest.java
@@ -175,8 +175,8 @@ public class CatalogTableTest extends 
BaseCatalogManagerTest {
         // Validate newly created table
         assertEquals(TABLE_NAME, table.name());
         assertEquals(catalog.defaultZone().id(), table.zoneId());
-        assertEquals(List.of("key1", "key2"), table.primaryKeyColumnNames());
-        assertEquals(List.of("key2"), table.colocationColumnNames());
+        assertEquals(IntList.of(0, 1), table.primaryKeyColumns());
+        assertEquals(IntList.of(1), table.colocationColumns());
 
         // Validate newly created pk index
         assertEquals(pkIndexName(TABLE_NAME), pkIndex.name());
@@ -662,8 +662,8 @@ public class CatalogTableTest extends 
BaseCatalogManagerTest {
         // Assert that all other properties have been left intact.
         assertThat(curDescriptor.id(), is(prevDescriptor.id()));
         assertThat(curDescriptor.columns(), is(prevDescriptor.columns()));
-        assertThat(curDescriptor.colocationColumnNames(), 
is(prevDescriptor.colocationColumnNames()));
-        assertThat(curDescriptor.primaryKeyColumnNames(), 
is(prevDescriptor.primaryKeyColumnNames()));
+        assertThat(curDescriptor.colocationColumns(), 
is(prevDescriptor.colocationColumns()));
+        assertThat(curDescriptor.primaryKeyColumns(), 
is(prevDescriptor.primaryKeyColumns()));
         assertThat(curDescriptor.primaryKeyIndexId(), 
is(prevDescriptor.primaryKeyIndexId()));
         assertThat(curDescriptor.schemaId(), is(prevDescriptor.schemaId()));
         assertThat(curDescriptor.latestSchemaVersion(), 
is(prevDescriptor.latestSchemaVersion()));
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java
index 557a96a667d..f38df8e22a8 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogTableDescriptorTest.java
@@ -78,7 +78,7 @@ class CatalogTableDescriptorTest {
                 .build();
 
         assertSoftly(assertions -> {
-            
assertions.assertThat(descriptor.colocationColumnNames()).containsExactly("pkCol");
+            
assertions.assertThat(descriptor.colocationColumns().intStream()).containsExactly(0);
             
assertions.assertThat(descriptor.updateTimestamp()).isEqualTo(INITIAL_TIMESTAMP);
             
assertions.assertThat(descriptor.isPrimaryKeyColumn("pkCol")).isTrue();
             
assertions.assertThat(descriptor.latestSchemaVersion()).isEqualTo(CatalogTableDescriptor.INITIAL_TABLE_VERSION);
@@ -92,7 +92,7 @@ class CatalogTableDescriptorTest {
                 .build();
 
         assertSoftly(assertions -> {
-            
assertions.assertThat(descriptor.colocationColumnNames()).containsExactly("pkCol");
+            
assertions.assertThat(descriptor.colocationColumns().intStream()).containsExactly(0);
             
assertions.assertThat(descriptorV2.updateTimestamp()).isEqualTo(HybridTimestamp.MAX_VALUE);
             
assertions.assertThat(descriptorV2.isPrimaryKeyColumn("pkCol")).isTrue();
             
assertions.assertThat(descriptorV2.latestSchemaVersion()).isEqualTo(2);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
index 325ab117a10..045e7180b60 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
@@ -34,6 +34,7 @@ import java.util.TreeSet;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Stream;
 import org.apache.ignite.internal.catalog.CatalogService;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
 import org.apache.ignite.internal.catalog.descriptors.CatalogColumnContainer;
 import org.apache.ignite.internal.catalog.descriptors.CatalogObjectDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
@@ -244,7 +245,7 @@ public class JdbcMetadataCatalog {
     private static JdbcPrimaryKeyMeta createPrimaryKeyMeta(String schemaName, 
CatalogTableDescriptor tbl) {
         String keyName = PK + tbl.name();
 
-        List<String> keyColNames = List.copyOf(tbl.primaryKeyColumnNames());
+        List<String> keyColNames = CatalogUtils.resolveColumnNames(tbl, 
tbl.primaryKeyColumns());
 
         return new JdbcPrimaryKeyMeta(schemaName, tbl.name(), keyName, 
keyColNames);
     }
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
index 59275d64ec2..d8a693ea18c 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaDescriptor.java
@@ -19,11 +19,10 @@ package org.apache.ignite.internal.schema;
 
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
-import it.unimi.dsi.fastutil.objects.Object2IntMap;
-import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.BitSet;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -93,89 +92,90 @@ public class SchemaDescriptor {
     }
 
     /** Constructor. */
+    @TestOnly
     public SchemaDescriptor(
             int ver,
             List<Column> columns,
             List<String> keyColumns,
             @Nullable List<String> colocationColumns
     ) {
+        this(
+                ver,
+                columns,
+                IntArrayList.toList(keyColumns.stream()
+                        .map(colName -> columns.stream().filter(c -> 
colName.equals(c.name())).findAny().get())
+                        .mapToInt(columns::indexOf)),
+                colocationColumns == null ? null
+                        : IntArrayList.toList(colocationColumns.stream()
+                                .map(colName -> columns.stream().filter(c -> 
colName.equals(c.name())).findAny().get())
+                                .mapToInt(columns::indexOf))
+        );
+    }
+
+    /** Constructor. */
+    public SchemaDescriptor(int ver, List<Column> columns, IntList 
keyColumnIndexes, @Nullable IntList colocationColumnIndexes) {
         assert !nullOrEmpty(columns) : "Schema should have at least one 
column";
+        assert colocationColumnIndexes == null || 
keyColumnIndexes.containsAll(colocationColumnIndexes);
+
+        boolean hasColocationKey = colocationColumnIndexes != null;
 
         Map<String, Column> columnsByName = new HashMap<>();
-        List<Column> orderedColumns = new ArrayList<>(columns.size());
+        Column[] orderedColumns = new Column[columns.size()];
+        Column[] keyColumns = new Column[keyColumnIndexes.size()];
+        Column[] colocationColumns = hasColocationKey ? new 
Column[colocationColumnIndexes.size()] : null;
+        Column[] valueColumns = new Column[columns.size() - 
keyColumnIndexes.size()];
 
-        Object2IntMap<String> columnNameToPositionInKey = 
toElementToPositionMap(keyColumns);
+        boolean hasTemporalColumns = false;
 
-        Object2IntMap<String> columnNameToPositionInColocation;
-        if (colocationColumns == null) {
-            columnNameToPositionInColocation = columnNameToPositionInKey;
-        } else {
-            columnNameToPositionInColocation = 
toElementToPositionMap(colocationColumns);
+        IntList effectiveColocationColumns = hasColocationKey ? 
colocationColumnIndexes : keyColumnIndexes;
 
-            assert 
columnNameToPositionInKey.keySet().containsAll(colocationColumns)
-                    : "Colocation column must be part of the key: keyCols="
-                    + keyColumns + ", colocationCols=" + colocationColumns;
-        }
+        for (int valueIndex = 0, rowPosition = 0; rowPosition < 
columns.size(); rowPosition++) {
+            Column column = columns.get(rowPosition);
+
+            int keyPosition = keyColumnIndexes.indexOf(rowPosition);
+            int colocationPosition = 
effectiveColocationColumns.indexOf(rowPosition);
+            int valuePosition = keyPosition == -1 ? valueIndex++ : -1;
 
-        boolean hasTemporalColumns = false;
-        int rowPosition = 0;
-        int valuePosition = 0;
-        for (Column column : columns) {
             Column orderedColumn = column.copy(
-                    rowPosition++,
-                    columnNameToPositionInKey.getOrDefault(column.name(), -1),
-                    columnNameToPositionInKey.containsKey(column.name()) ? -1 
: valuePosition++,
-                    
columnNameToPositionInColocation.getOrDefault(column.name(), -1)
+                    rowPosition,
+                    keyPosition,
+                    valuePosition,
+                    colocationPosition
             );
 
             Column old = columnsByName.put(orderedColumn.name(), 
orderedColumn);
 
             assert old == null : "Columns with similar names are not allowed: 
" + old.name();
 
-            orderedColumns.add(orderedColumn);
+            orderedColumns[rowPosition] = orderedColumn;
 
-            if (column.type() instanceof TemporalNativeType) {
-                hasTemporalColumns = true;
-            }
-        }
+            if (keyPosition == -1) {
+                assert colocationPosition == -1 : "Non key column cannot be 
colocation column: " + orderedColumn.name();
 
-        this.ver = ver;
-        this.columns = List.copyOf(orderedColumns);
-        this.columnsByName = Map.copyOf(columnsByName);
-        this.hasTemporalColumns = hasTemporalColumns;
+                valueColumns[valuePosition] = orderedColumn;
+            } else {
+                assert !orderedColumn.nullable() : "Primary key cannot contain 
nullable column: " + orderedColumn.name();
 
-        List<Column> tmpKeyColumns = new ArrayList<>(keyColumns.size());
+                keyColumns[keyPosition] = orderedColumn;
 
-        BitSet keyColumnsBitSet = new BitSet(columns.size());
-        for (String name : keyColumns) {
-            Column column = columnsByName.get(name);
-
-            assert column != null : name;
-            assert !column.nullable() : "Primary key cannot contain nullable 
column: " + name;
-
-            tmpKeyColumns.add(column);
-
-            assert !keyColumnsBitSet.get(column.positionInRow()) : 
column.name();
+                if (hasColocationKey && colocationPosition != -1) {
+                    colocationColumns[colocationPosition] = orderedColumn;
+                }
+            }
 
-            keyColumnsBitSet.set(column.positionInRow());
+            hasTemporalColumns = hasTemporalColumns || (column.type() 
instanceof TemporalNativeType);
         }
 
-        this.keyCols = List.copyOf(tmpKeyColumns);
-
-        this.colocationCols = colocationColumns == null
-                ? this.keyCols
-                : colocationColumns.stream()
-                        .map(columnsByName::get)
-                        .collect(Collectors.toList());
-
-        List<Column> tmpValueColumns = new ArrayList<>(columns.size() - 
keyColumnsBitSet.cardinality());
-        for (Column column : orderedColumns) {
-            if (!keyColumnsBitSet.get(column.positionInRow())) {
-                tmpValueColumns.add(column);
-            }
-        }
+        this.ver = ver;
+        this.columns = List.of(orderedColumns);
+        this.columnsByName = Map.copyOf(columnsByName);
+        this.hasTemporalColumns = hasTemporalColumns;
 
-        this.valCols = List.copyOf(tmpValueColumns);
+        this.keyCols = List.of(keyColumns);
+        this.valCols = List.of(valueColumns);
+        this.colocationCols = hasColocationKey
+                ? List.of(colocationColumns)
+                : this.keyCols;
     }
 
     private static List<Column> mergeColumns(Column[] keyColumns, Column[] 
valueColumns) {
@@ -352,17 +352,4 @@ public class SchemaDescriptor {
             return row;
         }
     }
-
-    private static Object2IntMap<String> toElementToPositionMap(List<String> 
elements) {
-        Object2IntMap<String> result = new Object2IntOpenHashMap<>();
-        int idx = 0;
-        for (String element : elements) {
-            assert !result.containsKey(element)
-                    : "Elements should not have duplicates: " + element;
-
-            result.put(element, idx++);
-        }
-
-        return result;
-    }
 }
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
index 32caadb3900..409afa99b62 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/catalog/CatalogToSchemaDescriptorConverter.java
@@ -19,10 +19,12 @@ package org.apache.ignite.internal.schema.catalog;
 
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 
+import it.unimi.dsi.fastutil.ints.IntList;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
 import org.apache.ignite.internal.catalog.commands.DefaultValue;
 import org.apache.ignite.internal.catalog.commands.DefaultValue.ConstantValue;
 import org.apache.ignite.internal.catalog.commands.DefaultValue.FunctionCall;
@@ -171,11 +173,15 @@ public final class CatalogToSchemaDescriptorConverter {
             columns.add(convert(column));
         }
 
+        IntList pkColumns = 
IntList.of(CatalogUtils.resolveColumnIndexesByIds(tableDescriptor, 
tableDescriptor.primaryKeyColumns()));
+        IntList colocationColumns = tableDescriptor.primaryKeyColumns() == 
tableDescriptor.colocationColumns()
+                ? null : 
IntList.of(CatalogUtils.resolveColumnIndexesByIds(tableDescriptor, 
tableDescriptor.colocationColumns()));
+
         return new SchemaDescriptor(
                 tableVersion,
                 columns,
-                tableDescriptor.primaryKeyColumnNames(),
-                tableDescriptor.colocationColumnNames()
+                pkColumns,
+                colocationColumns
         );
     }
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
index a8ce4668786..07bfa7624c4 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
@@ -20,8 +20,8 @@ package org.apache.ignite.internal.sql.engine.schema;
 import static 
org.apache.ignite.internal.catalog.descriptors.CatalogIndexStatus.AVAILABLE;
 import static 
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
-import it.unimi.dsi.fastutil.objects.Object2IntMap;
-import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -30,7 +30,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Supplier;
-import java.util.stream.Collectors;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.plan.RelTraitSet;
@@ -292,7 +291,6 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
     private TableDescriptor createTableDescriptorForTable(Catalog catalog, 
CatalogTableDescriptor descriptor) {
         List<CatalogTableColumnDescriptor> columns = descriptor.columns();
         List<ColumnDescriptor> colDescriptors = new ArrayList<>(columns.size() 
+ 2);
-        Object2IntMap<String> columnToIndex = buildColumnToIndexMap(columns);
 
         for (int i = 0; i < columns.size(); i++) {
             CatalogTableColumnDescriptor col = columns.get(i);
@@ -303,7 +301,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
         }
 
         if (Commons.implicitPkEnabled()) {
-            int implicitPkColIdx = 
columnToIndex.getOrDefault(Commons.IMPLICIT_PK_COL_NAME, -1);
+            int implicitPkColIdx = 
descriptor.columnIndex(Commons.IMPLICIT_PK_COL_NAME);
 
             if (implicitPkColIdx != -1) {
                 colDescriptors.set(implicitPkColIdx, 
injectDefault(colDescriptors.get(implicitPkColIdx)));
@@ -317,17 +315,14 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
 
         CatalogZoneDescriptor zoneDescriptor = 
Objects.requireNonNull(catalog.zone(descriptor.zoneId()));
         CatalogSchemaDescriptor schemaDescriptor = 
Objects.requireNonNull(catalog.schema(descriptor.schemaId()));
-        IgniteDistribution distribution = createDistribution(descriptor, 
columnToIndex, schemaDescriptor.name(), zoneDescriptor.name());
+        IgniteDistribution distribution = createDistribution(descriptor, 
schemaDescriptor.name(), zoneDescriptor.name());
 
         return new TableDescriptorImpl(colDescriptors, distribution);
     }
 
-    private IgniteDistribution createDistribution(
-            CatalogTableDescriptor descriptor, Object2IntMap<String> 
columnToIndex, String schemaName, String zoneName
-    ) {
-        List<Integer> colocationColumns = 
descriptor.colocationColumnNames().stream()
-                .map(columnToIndex::getInt)
-                .collect(Collectors.toList());
+    private IgniteDistribution createDistribution(CatalogTableDescriptor 
descriptor, String schemaName, String zoneName) {
+        IntList colocationColumns = 
IntArrayList.toList(descriptor.colocationColumns().intStream()
+                .map(descriptor::columnIndexById));
 
         int tableId = descriptor.id();
         int zoneId = descriptor.zoneId();
@@ -337,17 +332,6 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
         return IgniteDistributions.affinity(colocationColumns, tableId, 
zoneId, label);
     }
 
-    private static Object2IntMap<String> 
buildColumnToIndexMap(List<CatalogTableColumnDescriptor> columns) {
-        Object2IntMap<String> columnToIndex = new 
Object2IntOpenHashMap<>(columns.size() + 2);
-
-        for (int i = 0; i < columns.size(); i++) {
-            CatalogTableColumnDescriptor col = columns.get(i);
-            columnToIndex.put(col.name(), i);
-        }
-
-        return columnToIndex;
-    }
-
     private static ColumnDescriptorImpl createPartitionVirtualColumn(int 
logicalIndex, String partColName, NativeType type) {
         return new ColumnDescriptorImpl(
                 partColName,
@@ -489,11 +473,10 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
 
             IgniteIndex schemaIndex = indexCache.get(indexKey, (x) -> {
                 RelCollation outputCollation = 
IgniteIndex.createIndexCollation(indexDescriptor, table);
-                Object2IntMap<String> columnToIndex = 
buildColumnToIndexMap(table.columns());
 
                 CatalogZoneDescriptor zoneDescriptor = 
Objects.requireNonNull(catalog.zone(table.zoneId()));
                 CatalogSchemaDescriptor schemaDescriptor = 
Objects.requireNonNull(catalog.schema(table.schemaId()));
-                IgniteDistribution distribution = createDistribution(table, 
columnToIndex, schemaDescriptor.name(), zoneDescriptor.name());
+                IgniteDistribution distribution = createDistribution(table, 
schemaDescriptor.name(), zoneDescriptor.name());
 
                 return createSchemaIndex(
                         indexDescriptor,
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
index 5afb6934c60..ba01be975ed 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverterTest.java
@@ -39,10 +39,10 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.hasItem;
-import static org.hamcrest.Matchers.hasSize;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -50,6 +50,7 @@ import static 
org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
+import it.unimi.dsi.fastutil.ints.IntList;
 import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.LocalDate;
@@ -204,15 +205,7 @@ public class DdlSqlToCommandConverterTest extends 
AbstractDdlSqlToCommandConvert
                 )
         );
 
-        assertThat(
-                tblDesc.primaryKeyColumnNames(),
-                hasSize(1)
-        );
-
-        assertThat(
-                tblDesc.primaryKeyColumnNames(),
-                hasItem(Commons.IMPLICIT_PK_COL_NAME)
-        );
+        assertThat(tblDesc.primaryKeyColumns(), contains(0));
 
         assertThat(idxEntry.descriptor().indexType(), 
is(CatalogIndexDescriptorType.HASH));
     }
@@ -242,7 +235,7 @@ public class DdlSqlToCommandConverterTest extends 
AbstractDdlSqlToCommandConvert
         NewIndexEntry idxEntry = (NewIndexEntry) entries.get(1);
 
         assertThat(idxEntry.descriptor().indexType(), 
is(CatalogIndexDescriptorType.SORTED));
-        assertThat(tblEntry.descriptor().primaryKeyColumnNames(), 
equalTo(List.of("ID")));
+        assertThat(tblEntry.descriptor().primaryKeyColumns(), 
equalTo(IntList.of(0)));
         assertThat(((CatalogSortedIndexDescriptor) 
idxEntry.descriptor()).columns().get(0).collation(), is(collation));
     }
 
@@ -283,7 +276,7 @@ public class DdlSqlToCommandConverterTest extends 
AbstractDdlSqlToCommandConvert
 
         assertThat(idxEntry.descriptor().indexType(), 
is(CatalogIndexDescriptorType.HASH));
         assertThat(idxEntry.descriptor(), 
Matchers.instanceOf(CatalogHashIndexDescriptor.class));
-        assertThat(tblEntry.descriptor().primaryKeyColumnNames(), 
equalTo(List.of("ID")));
+        assertThat(tblEntry.descriptor().primaryKeyColumns(), 
equalTo(IntList.of(0)));
     }
 
     @Test


Reply via email to