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();