This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/ty/TableModelGrammar by this
push:
new 6c4f8045428 Support set configuration sql
6c4f8045428 is described below
commit 6c4f8045428fdebcb2c2f45e770e30f52d264040
Author: shuwenwei <[email protected]>
AuthorDate: Mon Aug 5 16:04:27 2024 +0800
Support set configuration sql
---
.../it/db/it/IoTDBSetConfigurationIT.java | 105 +++++++++++++++++++++
.../iotdb/db/queryengine/plan/Coordinator.java | 4 +-
.../execution/config/TableConfigTaskVisitor.java | 9 ++
.../db/queryengine/plan/parser/ASTVisitor.java | 2 +-
.../plan/relational/sql/ast/AstVisitor.java | 4 +
.../plan/relational/sql/ast/SetConfiguration.java | 34 +++++++
.../plan/relational/sql/parser/AstBuilder.java | 27 ++++++
.../db/relational/grammar/sql/RelationalSql.g4 | 6 ++
8 files changed, 189 insertions(+), 2 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBSetConfigurationIT.java
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBSetConfigurationIT.java
new file mode 100644
index 00000000000..9c323c0a5c5
--- /dev/null
+++
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBSetConfigurationIT.java
@@ -0,0 +1,105 @@
+/*
+ * 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.iotdb.relational.it.db.it;
+
+import org.apache.iotdb.commons.conf.CommonConfig;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.env.cluster.node.AbstractNodeWrapper;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.Statement;
+import java.util.Arrays;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class})
+public class IoTDBSetConfigurationIT {
+ @BeforeClass
+ public static void setUp() throws Exception {
+ EnvFactory.getEnv().initClusterEnvironment();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ EnvFactory.getEnv().cleanClusterEnvironment();
+ }
+
+ @Test
+ public void testSetConfiguration() {
+ try (Connection connection =
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+ Statement statement = connection.createStatement()) {
+ statement.execute("set configuration
enable_seq_space_compaction=\"false\"");
+ statement.execute("set configuration
enable_unseq_space_compaction=\'false\' on 0");
+ statement.execute("set configuration enable_cross_space_compaction=false
on 1");
+ statement.execute(
+ "set configuration
max_inner_compaction_candidate_file_num=1,max_cross_compaction_candidate_file_num=1
on 1");
+ } catch (Exception e) {
+ Assert.fail(e.getMessage());
+ }
+ Assert.assertTrue(
+ EnvFactory.getEnv().getConfigNodeWrapperList().stream()
+ .allMatch(
+ nodeWrapper ->
+ checkConfigFileContains(
+ nodeWrapper,
+ "enable_seq_space_compaction=false",
+ "enable_unseq_space_compaction=false")));
+ Assert.assertTrue(
+ EnvFactory.getEnv().getDataNodeWrapperList().stream()
+ .allMatch(
+ nodeWrapper ->
+ checkConfigFileContains(
+ nodeWrapper,
+ "enable_seq_space_compaction=false",
+ "enable_cross_space_compaction=false",
+ "max_inner_compaction_candidate_file_num=1",
+ "max_cross_compaction_candidate_file_num=1")));
+ }
+
+ private static boolean checkConfigFileContains(
+ AbstractNodeWrapper nodeWrapper, String... contents) {
+ try {
+ String systemPropertiesPath =
+ nodeWrapper.getNodePath()
+ + File.separator
+ + "conf"
+ + File.separator
+ + CommonConfig.SYSTEM_CONFIG_NAME;
+ File f = new File(systemPropertiesPath);
+ String fileContent = new String(Files.readAllBytes(f.toPath()));
+ System.out.println(fileContent);
+ return Arrays.stream(contents).allMatch(fileContent::contains);
+ } catch (IOException ignore) {
+ return false;
+ }
+ }
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
index afe23cf53ae..3aed822ec05 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
@@ -54,6 +54,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DescribeTable;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTable;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDB;
@@ -333,7 +334,8 @@ public class Coordinator {
|| statement instanceof ShowRegions
|| statement instanceof ShowDataNodes
|| statement instanceof ShowConfigNodes
- || statement instanceof Flush) {
+ || statement instanceof Flush
+ || statement instanceof SetConfiguration) {
return new ConfigExecution(
queryContext,
null,
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index a8d2158487f..46bd1139943 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -37,6 +37,7 @@ import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowTablesTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.UseDBTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.FlushTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.sys.SetConfigurationTask;
import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
import
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.TableHeaderSchemaValidator;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.AstVisitor;
@@ -54,6 +55,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Node;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Property;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDB;
@@ -65,6 +67,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundExceptio
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowClusterStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowRegionStatement;
import org.apache.iotdb.db.queryengine.plan.statement.sys.FlushStatement;
+import
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
import org.apache.tsfile.enums.TSDataType;
@@ -253,4 +256,10 @@ public class TableConfigTaskVisitor extends
AstVisitor<IConfigTask, MPPQueryCont
context.setQueryType(QueryType.WRITE);
return new FlushTask(((FlushStatement) node.getInnerTreeStatement()));
}
+
+ @Override
+ protected IConfigTask visitSetConfiguration(SetConfiguration node,
MPPQueryContext context) {
+ context.setQueryType(QueryType.WRITE);
+ return new SetConfigurationTask(((SetConfigurationStatement)
node.getInnerTreeStatement()));
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index 60421946298..60302379b0c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -2195,7 +2195,7 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
}
}
- private String parseStringLiteral(String src) {
+ public static String parseStringLiteral(String src) {
if (2 <= src.length()) {
// do not unescape string
String unWrappedString = src.substring(1, src.length() - 1);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
index f60360d4d06..e0d679be102 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
@@ -395,6 +395,10 @@ public abstract class AstVisitor<R, C> {
return visitStatement(node, context);
}
+ protected R visitSetConfiguration(SetConfiguration node, C context) {
+ return visitStatement(node, context);
+ }
+
protected R visitInsertRow(InsertRow node, C context) {
return visitStatement(node, context);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/SetConfiguration.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/SetConfiguration.java
new file mode 100644
index 00000000000..040452a5115
--- /dev/null
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/SetConfiguration.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.iotdb.db.queryengine.plan.relational.sql.ast;
+
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+import org.apache.iotdb.db.queryengine.plan.statement.Statement;
+
+public class SetConfiguration extends WrappedStatement {
+ public SetConfiguration(Statement innerTreeStatement, MPPQueryContext
context) {
+ super(innerTreeStatement, context);
+ }
+
+ @Override
+ public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+ return visitor.visitSetConfiguration(this, context);
+ }
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index 20160a4fe7f..6d24cb37a76 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -107,6 +107,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Row;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SearchedCaseExpression;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Select;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SelectItem;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetProperties;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
@@ -141,6 +142,7 @@ import
org.apache.iotdb.db.queryengine.plan.statement.StatementType;
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement;
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowsStatement;
import org.apache.iotdb.db.queryengine.plan.statement.sys.FlushStatement;
+import
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlBaseVisitor;
import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlLexer;
import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlParser;
@@ -161,8 +163,10 @@ import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Deque;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
@@ -175,6 +179,7 @@ import static
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory
import static
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.MEASUREMENT;
import static
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.TIME;
import static
org.apache.iotdb.db.queryengine.plan.parser.ASTVisitor.parseDateTimeFormat;
+import static
org.apache.iotdb.db.queryengine.plan.parser.ASTVisitor.parseStringLiteral;
import static
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.GroupingSets.Type.CUBE;
import static
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.GroupingSets.Type.EXPLICIT;
import static
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.GroupingSets.Type.ROLLUP;
@@ -685,6 +690,28 @@ public class AstBuilder extends
RelationalSqlBaseVisitor<Node> {
return super.visitLoadConfigurationStatement(ctx);
}
+ @Override
+ public Node visitSetConfigurationStatement(
+ RelationalSqlParser.SetConfigurationStatementContext ctx) {
+ SetConfigurationStatement setConfigurationStatement =
+ new SetConfigurationStatement(StatementType.SET_CONFIGURATION);
+ int nodeId =
+ Integer.parseInt(ctx.INTEGER_VALUE() == null ? "-1" :
ctx.INTEGER_VALUE().getText());
+ Map<String, String> configItems = new HashMap<>();
+ List<Property> properties = ImmutableList.of();
+ if (ctx.propertyAssignments() != null) {
+ properties = visit(ctx.propertyAssignments().property(), Property.class);
+ }
+ for (Property property : properties) {
+ String key = parseStringLiteral(property.getName().getValue());
+ String value =
parseStringLiteral(property.getNonDefaultValue().toString());
+ configItems.put(key, value);
+ }
+ setConfigurationStatement.setNodeId(nodeId);
+ setConfigurationStatement.setConfigItems(configItems);
+ return new SetConfiguration(setConfigurationStatement, null);
+ }
+
@Override
public Node
visitLocalOrClusterMode(RelationalSqlParser.LocalOrClusterModeContext ctx) {
return super.visitLocalOrClusterMode(ctx);
diff --git
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
index 4c73db0e0ba..0d7188d0245 100644
---
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
+++
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
@@ -100,6 +100,7 @@ statement
| showQueriesStatement
| killQueryStatement
| loadConfigurationStatement
+ | setConfigurationStatement
// auth Statement
@@ -333,6 +334,11 @@ loadConfigurationStatement
: LOAD CONFIGURATION localOrClusterMode?
;
+// Set Configuration
+setConfigurationStatement
+ : SET CONFIGURATION propertyAssignments (ON INTEGER_VALUE)?
+ ;
+
localOrClusterMode
: (ON (LOCAL | CLUSTER))
;