diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java new file mode 100644 index 0000000000000..10d8ecb292606 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java @@ -0,0 +1,59 @@ +/* + * 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; +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.DropIndexStatement; + +/** + * Drop index statement binder. + */ +public class DropIndexStatementBinder implements SQLStatementBinder { + + @Override + public DropIndexStatement bind(final DropIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { + if (!sqlStatement.getSimpleTable().isPresent()) { + return sqlStatement; + } + DropIndexStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setSimpleTable(SimpleTableSegmentBinder.bind(sqlStatement.getSimpleTable().get(), binderContext, tableBinderContexts)); + sqlStatement.getIndexes().forEach(each -> result.getIndexes().add(each)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static DropIndexStatement copy(final DropIndexStatement sqlStatement) { + DropIndexStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + sqlStatement.getSimpleTable().ifPresent(result::setSimpleTable); + sqlStatement.getAlgorithmType().ifPresent(result::setAlgorithmType); + sqlStatement.getLockTable().ifPresent(result::setLockTable); + result.setIfExists(sqlStatement.isIfExists()); + 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 9bb698c5793a6..1860554f46b4e 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.CreateTableStatementBinder; 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.DropIndexStatementBinder; 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; @@ -36,6 +37,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; 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.DropIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; @@ -83,6 +85,9 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof TruncateStatement) { return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); } + if (statement instanceof DropIndexStatement) { + return new DropIndexStatementBinder().bind((DropIndexStatement) statement, binderContext); + } return statement; } } diff --git a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java index 59841bf11bc59..8d589a494af67 100644 --- a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java +++ b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java @@ -348,7 +348,8 @@ public ASTNode visitAlterIndex(final AlterIndexContext ctx) { @Override public ASTNode visitDropIndex(final DropIndexContext ctx) { - SQLServerDropIndexStatement result = new SQLServerDropIndexStatement(null != ctx.ifExists()); + SQLServerDropIndexStatement result = new SQLServerDropIndexStatement(); + result.setIfExists(null != ctx.ifExists()); result.getIndexes().add((IndexSegment) visit(ctx.indexName())); result.setSimpleTable((SimpleTableSegment) visit(ctx.tableName())); return result; diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java index bf77783b993d1..1c8edfd88c2c3 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java @@ -45,6 +45,14 @@ public Optional getSimpleTable() { return Optional.empty(); } + /** + * Set simple table. + * + * @param simpleTableSegment simple table + */ + public void setSimpleTable(final SimpleTableSegment simpleTableSegment) { + } + /** * Judge whether contains exist clause or not. * @@ -54,6 +62,14 @@ public boolean isIfExists() { return false; } + /** + * Set if exists or not. + * + * @param ifExists if exists or not + */ + public void setIfExists(final boolean ifExists) { + } + /** * Get algorithm type. * @@ -63,6 +79,14 @@ public Optional getAlgorithmType() { return Optional.empty(); } + /** + * Set algorithm type. + * + * @param algorithmTypeSegment algorithm type + */ + public void setAlgorithmType(final AlgorithmTypeSegment algorithmTypeSegment) { + } + /** * Get lock table segment. * @@ -71,4 +95,12 @@ public Optional getAlgorithmType() { public Optional getLockTable() { return Optional.empty(); } + + /** + * Set lock table segment. + * + * @param lockTableSegment lock table segment + */ + public void setLockTable(final LockTableSegment lockTableSegment) { + } } diff --git a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java index 679bd86c5b8b7..e2c766cec85a9 100644 --- a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java +++ b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java @@ -34,7 +34,7 @@ @Setter public final class SQLServerDropIndexStatement extends DropIndexStatement implements SQLServerStatement { - private final boolean ifExists; + private boolean ifExists; private SimpleTableSegment simpleTable; diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-index.xml b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml new file mode 100644 index 0000000000000..73f8237cc432a --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + + +
+ + +
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/drop-index.xml b/test/it/binder/src/test/resources/sqls/ddl/drop-index.xml new file mode 100644 index 0000000000000..e64352098a617 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/drop-index.xml @@ -0,0 +1,23 @@ + + + + + + + +