This is an automated email from the ASF dual-hosted git repository.
ppa pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 266fdc6fa6 IGNITE-20606 Sql. Add syntax to support setting the default
distribution zone (#3567)
266fdc6fa6 is described below
commit 266fdc6fa6133b4052f3e4c37413e5ffd81d2486
Author: Pavel Pereslegin <[email protected]>
AuthorDate: Tue Apr 9 14:03:02 2024 +0300
IGNITE-20606 Sql. Add syntax to support setting the default distribution
zone (#3567)
---
.../AlterZoneSetDefaultCatalogCommand.java | 76 ++++++++++++++++++++++
.../ignite/internal/sql/engine/ItZoneDdlTest.java | 9 +++
modules/sql-engine/src/main/codegen/config.fmpp | 1 +
.../src/main/codegen/includes/parserImpls.ftl | 13 +++-
.../sql/engine/exec/ddl/DdlCommandHandler.java | 9 +++
.../exec/ddl/DdlToCatalogCommandConverter.java | 8 +++
.../prepare/ddl/AlterZoneSetDefaultCommand.java | 34 ++++++++++
.../prepare/ddl/DdlSqlToCommandConverter.java | 21 ++++++
.../engine/sql/IgniteSqlAlterZoneSetDefault.java | 67 +++++++++++++++++++
.../DistributionZoneSqlToCommandConverterTest.java | 24 +++++++
10 files changed, 259 insertions(+), 3 deletions(-)
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneSetDefaultCatalogCommand.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneSetDefaultCatalogCommand.java
new file mode 100644
index 0000000000..50e8fe2e1e
--- /dev/null
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneSetDefaultCatalogCommand.java
@@ -0,0 +1,76 @@
+/*
+ * 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.catalog.commands;
+
+import static
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_ZONE_NAME;
+
+import java.util.Collections;
+import java.util.List;
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogCommand;
+import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.apache.ignite.internal.catalog.storage.UpdateEntry;
+
+/**
+ * A command that set specified zone as default.
+ */
+public class AlterZoneSetDefaultCatalogCommand extends AbstractZoneCommand {
+ /** Returns builder to create a command that set specified zone as
default. */
+ public static Builder builder() {
+ return new AlterZoneSetDefaultCatalogCommand.Builder();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param zoneName Name of the zone.
+ * @throws CatalogValidationException if any of restrictions above is
violated.
+ */
+ private AlterZoneSetDefaultCatalogCommand(String zoneName) throws
CatalogValidationException {
+ super(zoneName);
+ }
+
+ @Override
+ public List<UpdateEntry> get(Catalog catalog) {
+ // TODO https://issues.apache.org/jira/browse/IGNITE-19687
+ if (zoneName.equals(DEFAULT_ZONE_NAME)) {
+ return Collections.emptyList();
+ }
+
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Builder of a command that set specified zone as default.
+ */
+ public static class Builder implements AbstractZoneCommandBuilder<Builder>
{
+ private String zoneName;
+
+ @Override
+ public Builder zoneName(String zoneName) {
+ this.zoneName = zoneName;
+
+ return this;
+ }
+
+ @Override
+ public CatalogCommand build() {
+ return new AlterZoneSetDefaultCatalogCommand(zoneName);
+ }
+ }
+}
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
index 2169acb4b0..5fdba7b80c 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZoneDdlTest.java
@@ -17,7 +17,10 @@
package org.apache.ignite.internal.sql.engine;
+import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
+
import org.apache.ignite.internal.ClusterPerClassIntegrationTest;
+import org.apache.ignite.internal.catalog.CatalogService;
import
org.apache.ignite.internal.catalog.DistributionZoneExistsValidationException;
import
org.apache.ignite.internal.catalog.DistributionZoneNotFoundValidationException;
import org.apache.ignite.internal.testframework.IgniteTestUtils;
@@ -112,6 +115,12 @@ public class ItZoneDdlTest extends
ClusterPerClassIntegrationTest {
tryToAlterZone("not_existing_" + ZONE_NAME, 200, false);
}
+ @Test
+ public void testSetDefaultZoneThatIsAlreadyDefaultDoesNotThrowException() {
+ // TODO https://issues.apache.org/jira/browse/IGNITE-19687 The test
should not only check the zone named "Default".
+ sql(format("ALTER ZONE \"{}\" SET DEFAULT",
CatalogService.DEFAULT_ZONE_NAME));
+ }
+
private static void tryToCreateZone(String zoneName, boolean failIfExists)
{
sql(String.format("CREATE ZONE %s", failIfExists ? zoneName : "IF NOT
EXISTS " + zoneName));
}
diff --git a/modules/sql-engine/src/main/codegen/config.fmpp
b/modules/sql-engine/src/main/codegen/config.fmpp
index 418f9f5f17..a7296bd0cb 100644
--- a/modules/sql-engine/src/main/codegen/config.fmpp
+++ b/modules/sql-engine/src/main/codegen/config.fmpp
@@ -55,6 +55,7 @@ data: {
"org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneSet",
"org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneRenameTo",
"org.apache.ignite.internal.sql.engine.sql.IgniteSqlTypeNameSpec",
+ "org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneSetDefault",
"org.apache.ignite.internal.sql.engine.type.UuidType",
]
diff --git a/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
b/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
index 5e9c164165..2b3040b7c9 100644
--- a/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
+++ b/modules/sql-engine/src/main/codegen/includes/parserImpls.ftl
@@ -587,9 +587,16 @@ SqlNode SqlAlterZone() :
return new IgniteSqlAlterZoneRenameTo(s.end(this), zoneId, newZoneId,
ifExists);
}
|
- <SET> { s.add(this); } optionList = AlterZoneOptions() {
- return new IgniteSqlAlterZoneSet(s.end(this), zoneId, optionList,
ifExists);
- }
+ <SET>
+ (
+ <DEFAULT_> {
+ return new IgniteSqlAlterZoneSetDefault(s.end(this), zoneId,
ifExists);
+ }
+ |
+ { s.add(this); } optionList = AlterZoneOptions() {
+ return new IgniteSqlAlterZoneSet(s.end(this), zoneId, optionList,
ifExists);
+ }
+ )
)
}
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 c6e6f5832e..105822d9d5 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
@@ -54,6 +54,7 @@ import
org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableAddCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableDropCommand;
import
org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneRenameCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneSetCommand;
+import
org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneSetDefaultCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateTableCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateZoneCommand;
@@ -111,6 +112,8 @@ public class DdlCommandHandler implements LifecycleAware {
return handleRenameZone((AlterZoneRenameCommand) cmd);
} else if (cmd instanceof AlterZoneSetCommand) {
return handleAlterZone((AlterZoneSetCommand) cmd);
+ } else if (cmd instanceof AlterZoneSetDefaultCommand) {
+ return handleAlterZoneSetDefault((AlterZoneSetDefaultCommand) cmd);
} else if (cmd instanceof DropZoneCommand) {
return handleDropZone((DropZoneCommand) cmd);
} else {
@@ -138,6 +141,12 @@ public class DdlCommandHandler implements LifecycleAware {
.handle(handleModificationResult(cmd.ifExists(),
DistributionZoneNotFoundValidationException.class));
}
+ /** Handles alter zone set default command. */
+ private CompletableFuture<Boolean>
handleAlterZoneSetDefault(AlterZoneSetDefaultCommand cmd) {
+ return
catalogManager.execute(DdlToCatalogCommandConverter.convert(cmd))
+ .handle(handleModificationResult(cmd.ifExists(),
DistributionZoneNotFoundValidationException.class));
+ }
+
/** Handles drop distribution zone command. */
private CompletableFuture<Boolean> handleDropZone(DropZoneCommand cmd) {
return
catalogManager.execute(DdlToCatalogCommandConverter.convert(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 b2cabe1e70..a1fe0f8fe4 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
@@ -32,6 +32,7 @@ import
org.apache.ignite.internal.catalog.commands.AlterTableAlterColumnCommand;
import
org.apache.ignite.internal.catalog.commands.AlterTableAlterColumnCommandBuilder;
import org.apache.ignite.internal.catalog.commands.AlterTableDropColumnCommand;
import org.apache.ignite.internal.catalog.commands.AlterZoneCommand;
+import
org.apache.ignite.internal.catalog.commands.AlterZoneSetDefaultCatalogCommand;
import org.apache.ignite.internal.catalog.commands.ColumnParams;
import org.apache.ignite.internal.catalog.commands.CreateHashIndexCommand;
import org.apache.ignite.internal.catalog.commands.CreateSortedIndexCommand;
@@ -47,6 +48,7 @@ import
org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableAddCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterTableDropCommand;
import
org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneRenameCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneSetCommand;
+import
org.apache.ignite.internal.sql.engine.prepare.ddl.AlterZoneSetDefaultCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.ColumnDefinition;
import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateIndexCommand;
import org.apache.ignite.internal.sql.engine.prepare.ddl.CreateTableCommand;
@@ -152,6 +154,12 @@ class DdlToCatalogCommandConverter {
.build();
}
+ static CatalogCommand convert(AlterZoneSetDefaultCommand cmd) {
+ return AlterZoneSetDefaultCatalogCommand.builder()
+ .zoneName(cmd.zoneName())
+ .build();
+ }
+
static CatalogCommand convert(AlterColumnCommand cmd) {
AlterTableAlterColumnCommandBuilder builder =
AlterTableAlterColumnCommand.builder()
.schemaName(cmd.schemaName())
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/AlterZoneSetDefaultCommand.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/AlterZoneSetDefaultCommand.java
new file mode 100644
index 0000000000..f5111e83ce
--- /dev/null
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/AlterZoneSetDefaultCommand.java
@@ -0,0 +1,34 @@
+/*
+ * 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.sql.engine.prepare.ddl;
+
+/**
+ * ALTER ZONE ... SET DEFAULT statement.
+ */
+public class AlterZoneSetDefaultCommand extends AbstractZoneDdlCommand {
+ /** Quietly ignore this command if zone does not exists. */
+ private boolean ifExists;
+
+ public boolean ifExists() {
+ return ifExists;
+ }
+
+ public void ifExists(boolean ifExists) {
+ this.ifExists = ifExists;
+ }
+}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
index b58ce671ff..460a12eac9 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
@@ -94,6 +94,7 @@ import
org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterTableAddColumn;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterTableDropColumn;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneRenameTo;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneSet;
+import org.apache.ignite.internal.sql.engine.sql.IgniteSqlAlterZoneSetDefault;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCreateIndex;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCreateTable;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCreateTableOption;
@@ -254,6 +255,10 @@ public class DdlSqlToCommandConverter {
return convertAlterZoneSet((IgniteSqlAlterZoneSet) ddlNode, ctx);
}
+ if (ddlNode instanceof IgniteSqlAlterZoneSetDefault) {
+ return convertAlterZoneSetDefault((IgniteSqlAlterZoneSetDefault)
ddlNode, ctx);
+ }
+
if (ddlNode instanceof IgniteSqlDropZone) {
return convertDropZone((IgniteSqlDropZone) ddlNode, ctx);
}
@@ -653,6 +658,22 @@ public class DdlSqlToCommandConverter {
return alterZoneCmd;
}
+ /**
+ * Converts the given {@link IgniteSqlAlterZoneSetDefault} AST node to a
{@link AlterZoneSetDefaultCommand}.
+ *
+ * @param alterZoneSetDefault Root node of the given AST.
+ * @param ctx Planning context.
+ */
+ private DdlCommand convertAlterZoneSetDefault(IgniteSqlAlterZoneSetDefault
alterZoneSetDefault, PlanningContext ctx) {
+ AlterZoneSetDefaultCommand cmd = new AlterZoneSetDefaultCommand();
+
+ cmd.schemaName(deriveSchemaName(alterZoneSetDefault.name(), ctx));
+ cmd.zoneName(deriveObjectName(alterZoneSetDefault.name(), ctx,
"zoneName"));
+ cmd.ifExists(alterZoneSetDefault.ifExists());
+
+ return cmd;
+ }
+
/**
* Converts the given IgniteSqlAlterZoneRenameTo AST node to a
AlterZoneCommand.
*
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlAlterZoneSetDefault.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlAlterZoneSetDefault.java
new file mode 100644
index 0000000000..28990eab65
--- /dev/null
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/IgniteSqlAlterZoneSetDefault.java
@@ -0,0 +1,67 @@
+/*
+ * 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.sql.engine.sql;
+
+import java.util.List;
+import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.SqlLiteral;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlWriter;
+import org.apache.calcite.sql.parser.SqlParserPos;
+import org.apache.calcite.util.ImmutableNullableList;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/**
+ * Parse tree for {@code ALTER ZONE SET DEFAULT} statement.
+ */
+public class IgniteSqlAlterZoneSetDefault extends IgniteAbstractSqlAlterZone {
+
+ /** ALTER ZONE SET DEFAULT operator. */
+ protected static class Operator extends IgniteDdlOperator {
+
+ /** Constructor. */
+ protected Operator(boolean existsFlag) {
+ super("ALTER ZONE", SqlKind.OTHER_DDL, existsFlag);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public SqlCall createCall(@Nullable SqlLiteral functionQualifier,
SqlParserPos pos, @Nullable SqlNode... operands) {
+ return new IgniteSqlAlterZoneSetDefault(pos, (SqlIdentifier)
operands[0], existFlag());
+ }
+ }
+
+ /** Constructor. */
+ public IgniteSqlAlterZoneSetDefault(SqlParserPos pos, SqlIdentifier name,
boolean ifExists) {
+ super(new Operator(ifExists), pos, name);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public List<SqlNode> getOperandList() {
+ return ImmutableNullableList.of(name);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ protected void unparseAlterZoneOperation(SqlWriter writer, int leftPrec,
int rightPrec) {
+ writer.keyword("SET DEFAULT");
+ }
+}
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
index 3445ca69dc..6d444f0dce 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
@@ -180,6 +180,30 @@ public class DistributionZoneSqlToCommandConverterTest
extends AbstractDdlSqlToC
assertThat(zoneCmd.dataNodesAutoAdjust(), equalTo(300));
}
+ @Test
+ public void testAlterZoneSetDefault() throws SqlParseException {
+ SqlNode node = parse("ALTER ZONE test SET DEFAULT");
+
+ DdlCommand cmd = converter.convert((SqlDdl) node, createContext());
+ assertThat(cmd, Matchers.instanceOf(AlterZoneSetDefaultCommand.class));
+
+ AlterZoneSetDefaultCommand zoneCmd = (AlterZoneSetDefaultCommand) cmd;
+ assertThat(zoneCmd.zoneName(), equalTo("TEST"));
+ assertThat(zoneCmd.ifExists(), is(false));
+ }
+
+ @Test
+ public void testAlterZoneSetDefaultIfExists() throws SqlParseException {
+ SqlNode node = parse("ALTER ZONE IF EXISTS test SET DEFAULT");
+
+ DdlCommand cmd = converter.convert((SqlDdl) node, createContext());
+ assertThat(cmd, Matchers.instanceOf(AlterZoneSetDefaultCommand.class));
+
+ AlterZoneSetDefaultCommand zoneCmd = (AlterZoneSetDefaultCommand) cmd;
+ assertThat(zoneCmd.zoneName(), equalTo("TEST"));
+ assertThat(zoneCmd.ifExists(), is(true));
+ }
+
@Test
public void testAlterZoneCommandWithInvalidOptions() throws
SqlParseException {
SqlNode node = parse("ALTER ZONE test SET replicas=2,
data_nodes_auto_adjust=-100");