You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pp...@apache.org on 2022/11/09 15:16:02 UTC

[ignite-3] branch main updated: IGNITE-17729 Forbid a table and an index with the same name (#1318)

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

ppa 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 e38a01a301 IGNITE-17729 Forbid a table and an index with the same name (#1318)
e38a01a301 is described below

commit e38a01a3015ae8b852397defbe637072ccb9602e
Author: Pavel Pereslegin <xx...@gmail.com>
AuthorDate: Wed Nov 9 18:15:55 2022 +0300

    IGNITE-17729 Forbid a table and an index with the same name (#1318)
---
 .../ignite/internal/index/IndexManagerTest.java    | 53 +++++++++++++++++++++-
 .../schema/configuration/TableValidatorImpl.java   |  9 ++++
 .../configuration/index/IndexValidatorImpl.java    |  8 ++++
 3 files changed, 69 insertions(+), 1 deletion(-)

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 725d336018..bbe8dce0c9 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
@@ -57,6 +57,8 @@ import org.apache.ignite.internal.schema.configuration.ExtendedTableChange;
 import org.apache.ignite.internal.schema.configuration.ExtendedTableConfigurationSchema;
 import org.apache.ignite.internal.schema.configuration.TableChange;
 import org.apache.ignite.internal.schema.configuration.TableConfiguration;
+import org.apache.ignite.internal.schema.configuration.TableValidator;
+import org.apache.ignite.internal.schema.configuration.TableValidatorImpl;
 import org.apache.ignite.internal.schema.configuration.TableView;
 import org.apache.ignite.internal.schema.configuration.TablesConfiguration;
 import org.apache.ignite.internal.schema.configuration.defaultvalue.ConstantValueDefaultConfigurationSchema;
@@ -109,7 +111,8 @@ public class IndexManagerTest {
     public static void setUp() throws Exception {
         confRegistry = new ConfigurationRegistry(
                 List.of(TablesConfiguration.KEY),
-                Map.of(IndexValidator.class, Set.of(IndexValidatorImpl.INSTANCE)),
+                Map.of(IndexValidator.class, Set.of(IndexValidatorImpl.INSTANCE),
+                        TableValidator.class, Set.of(TableValidatorImpl.INSTANCE)),
                 new TestConfigurationStorage(DISTRIBUTED),
                 List.of(ExtendedTableConfigurationSchema.class),
                 List.of(
@@ -326,6 +329,54 @@ public class IndexManagerTest {
         assertThat(holder.get().indexId(), equalTo(indexId));
     }
 
+    @Test
+    public void createIndexWithExistingTableName() {
+        CompletableFuture<Boolean> createIdxFut = indexManager.createIndexAsync("sName", "tName", "tName", true, indexChange ->
+                indexChange.convert(SortedIndexChange.class).changeColumns(columns ->
+                        columns.create("c2", columnChange -> columnChange.changeAsc(true))));
+
+        CompletionException completionException = assertThrows(CompletionException.class, createIdxFut::join);
+
+        assertTrue(IgniteTestUtils.hasCause(completionException, ConfigurationValidationException.class,
+                "Table with the same name already exists."));
+    }
+
+    @Test
+    public void createTableWithExistingIndexName() {
+        String indexName = "idx" + index.incrementAndGet();
+
+        List<UUID> ids = ((NamedListConfiguration<TableConfiguration, ?, ?>) tablesConfig.tables()).internalIds();
+        assertEquals(1, ids.size());
+
+        UUID tableId = ids.get(0);
+
+        boolean created = indexManager.createIndexAsync("sName", indexName, "tName", true, indexChange -> {
+            SortedIndexChange sortedIndexChange = indexChange.convert(SortedIndexChange.class);
+
+            sortedIndexChange.changeColumns(columns -> {
+                columns.create("c2", columnChange -> columnChange.changeAsc(true));
+            });
+
+            sortedIndexChange.changeTableId(tableId);
+        }).join();
+
+        assertTrue(created);
+
+        try {
+            CompletableFuture<Void> createTblFut = tablesConfig.tables().change(tableChange -> tableChange.create(indexName, chg -> {
+                chg.changeColumns(cols -> cols.create("c1", col -> col.changeType(t -> t.changeType("STRING"))))
+                        .changePrimaryKey(pk -> pk.changeColumns("c1").changeColocationColumns("c1"));
+            }));
+
+            CompletionException completionException = assertThrows(CompletionException.class, createTblFut::join);
+
+            assertTrue(IgniteTestUtils.hasCause(completionException, ConfigurationValidationException.class,
+                    "Index with the same name already exists."));
+        } finally {
+            indexManager.dropIndexAsync("sName", indexName, true).join();
+        }
+    }
+
     private static Object toMap(Object obj) {
         assert obj instanceof TraversableTreeNode;
 
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 d531151e24..7f3c6f56eb 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
@@ -22,6 +22,7 @@ import static org.apache.ignite.internal.util.ArrayUtils.nullOrEmpty;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -40,9 +41,17 @@ public class TableValidatorImpl implements Validator<TableValidator, NamedListVi
     /** {@inheritDoc} */
     @Override
     public void validate(TableValidator annotation, ValidationContext<NamedListView<TableView>> ctx) {
+        TablesView tablesConfig = ctx.getNewRoot(TablesConfiguration.KEY);
+
+        Set<String> idxNames = tablesConfig == null ? Collections.emptySet() : new HashSet<>(tablesConfig.indexes().namedListKeys());
+
         NamedListView<TableView> newTables = ctx.getNewValue();
 
         for (String tableName : newKeys(ctx.getOldValue(), ctx.getNewValue())) {
+            if (idxNames.contains(tableName)) {
+                ctx.addIssue(new ValidationIssue(tableName, "Unable to create table. Index with the same name already exists."));
+            }
+
             TableView newTable = newTables.get(tableName);
 
             if (newTable.columns() == null || newTable.columns().size() == 0) {
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/index/IndexValidatorImpl.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/index/IndexValidatorImpl.java
index e767911135..9c980036eb 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/index/IndexValidatorImpl.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/configuration/index/IndexValidatorImpl.java
@@ -22,7 +22,9 @@ import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.ge
 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 java.util.UUID;
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.configuration.validation.ValidationContext;
@@ -49,7 +51,13 @@ public class IndexValidatorImpl implements Validator<IndexValidator, NamedListVi
 
         NamedListView<? extends TableView> tablesView = tablesConfig.tables();
 
+        Set<String> tblNames = new HashSet<>(tablesView.namedListKeys());
+
         for (String key : newKeys(ctx.getOldValue(), ctx.getNewValue())) {
+            if (tblNames.contains(key)) {
+                ctx.addIssue(new ValidationIssue(key, "Unable to create index. Table with the same name already exists."));
+            }
+
             TableIndexView idxView = indexView.get(key);
 
             UUID tableId = idxView.tableId();