diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 02663ad74b984..92a9855fedaa1 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -43,6 +43,7 @@ 1. SQL Binder: Support alter table, drop table sql bind and add test case - [#34154](https://github.com/apache/shardingsphere/pull/34154) 1. SQL Binder: Support rename table statement sql bind and split segment bind to ddl and dml package - [#34158](https://github.com/apache/shardingsphere/pull/34158) 1. SQL Binder: Support copy statement sql bind and add bind test case - [#34159](https://github.com/apache/shardingsphere/pull/34159) +1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) ### Bug Fixes diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/TruncateStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/TruncateStatementBinder.java new file mode 100644 index 0000000000000..f9a9969f71c31 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/TruncateStatementBinder.java @@ -0,0 +1,51 @@ +/* + * 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.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; + +/** + * Truncate statement binder. + */ +public final class TruncateStatementBinder implements SQLStatementBinder { + + @Override + public TruncateStatement bind(final TruncateStatement sqlStatement, final SQLStatementBinderContext binderContext) { + TruncateStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getTables().forEach(each -> result.getTables().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static TruncateStatement copy(final TruncateStatement sqlStatement) { + TruncateStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 6f610e8610de6..07de9be627abe 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.RenameTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.TruncateStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; @@ -34,6 +35,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; /** * DDL statement bind engine. @@ -73,6 +75,9 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof CreateIndexStatement) { return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext); } + if (statement instanceof TruncateStatement) { + return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); + } return statement; } } diff --git a/test/it/binder/src/test/resources/cases/ddl/cursor.xml b/test/it/binder/src/test/resources/cases/ddl/cursor.xml new file mode 100644 index 0000000000000..0772e747d009c --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/cursor.xml @@ -0,0 +1,93 @@ + + + + + + + + + diff --git a/test/it/binder/src/test/resources/cases/ddl/truncate-table.xml b/test/it/binder/src/test/resources/cases/ddl/truncate-table.xml new file mode 100644 index 0000000000000..41759a903735b --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/truncate-table.xml @@ -0,0 +1,28 @@ + + + + + + + + + + +
+
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/truncate-table.xml b/test/it/binder/src/test/resources/sqls/ddl/truncate-table.xml new file mode 100644 index 0000000000000..0b49b1b2362be --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/truncate-table.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/dml/cursor.xml b/test/it/binder/src/test/resources/sqls/dml/cursor.xml new file mode 100644 index 0000000000000..d952df8cc2fa1 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/cursor.xml @@ -0,0 +1,21 @@ + + + + + +