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