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 <xxt...@gmail.com> 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");