Skip to content

Commit

Permalink
Support alter index sql bind and add test case. (apache#34029)
Browse files Browse the repository at this point in the history
  • Loading branch information
yaofly committed Dec 26, 2024
1 parent 878d16b commit b3e9a68
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,10 @@ public static SimpleTableSegment bind(final SimpleTableSegment segment, final SQ
IdentifierValue tableName = segment.getTableName().getIdentifier();
ShardingSphereSchema schema = binderContext.getMetaData().getDatabase(databaseName.getValue()).getSchema(schemaName.getValue());
checkTableExists(binderContext, schema, schemaName.getValue(), tableName.getValue());
tableBinderContexts.put(new CaseInsensitiveString(segment.getAliasName().orElseGet(tableName::getValue)),
createSimpleTableBinderContext(segment, schema, databaseName, schemaName, binderContext));
if (null != tableBinderContexts) {
tableBinderContexts.put(new CaseInsensitiveString(segment.getAliasName().orElseGet(tableName::getValue)),
createSimpleTableBinderContext(segment, schema, databaseName, schemaName, binderContext));
}
TableNameSegment tableNameSegment = new TableNameSegment(segment.getTableName().getStartIndex(), segment.getTableName().getStopIndex(), tableName);
tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(databaseName, schemaName));
SimpleTableSegment result = new SimpleTableSegment(tableNameSegment);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* 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 lombok.SneakyThrows;
import org.apache.shardingsphere.infra.binder.engine.segment.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.AlterIndexStatement;
import org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.SQLServerAlterIndexStatement;

/**
* Alter index statement binder.
*/
public class AlterIndexStatementBinder implements SQLStatementBinder<AlterIndexStatement> {

@Override
public AlterIndexStatement bind(final AlterIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) {
if (sqlStatement instanceof SQLServerAlterIndexStatement) {
SQLServerAlterIndexStatement source = (SQLServerAlterIndexStatement) sqlStatement;
if (!source.getSimpleTable().isPresent()) {
return sqlStatement;
}
SQLServerAlterIndexStatement result = copy(source);
result.setSimpleTable(SimpleTableSegmentBinder.bind(source.getSimpleTable().get(), binderContext, null));
return result;
}
return sqlStatement;
}

@SneakyThrows(ReflectiveOperationException.class)
private static SQLServerAlterIndexStatement copy(final SQLServerAlterIndexStatement sqlStatement) {
SQLServerAlterIndexStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance();
sqlStatement.getIndex().ifPresent(result::setIndex);
sqlStatement.getSimpleTable().ifPresent(result::setSimpleTable);
result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments());
result.getCommentSegments().addAll(sqlStatement.getCommentSegments());
result.getVariableNames().addAll(sqlStatement.getVariableNames());
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@

import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext;
import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterIndexStatementBinder;
import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateIndexStatementBinder;
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.hint.HintValueContext;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement;
import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement;
import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement;
Expand Down Expand Up @@ -58,6 +60,9 @@ public DDLStatement bind(final DDLStatement statement) {
if (statement instanceof CreateIndexStatement) {
return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext);
}
if (statement instanceof AlterIndexStatement) {
return new AlterIndexStatementBinder().bind((AlterIndexStatement) statement, binderContext);
}
return statement;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* 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.test.it.sql.binder.dialect.sqlserver;

import org.apache.shardingsphere.test.it.sql.binder.SQLBinderIT;
import org.apache.shardingsphere.test.it.sql.binder.SQLBinderITSettings;

@SQLBinderITSettings("SQLServer")
class SQLServerBinderIT extends SQLBinderIT {
}
30 changes: 30 additions & 0 deletions test/it/binder/src/test/resources/cases/ddl/alter-index.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ 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.
-->

<sql-parser-test-cases>
<alter-index sql-case-id="alter_index_with_schema">
<index name="idx_user_id" start-index="12" stop-index="22"/>
<table name="t_order" start-index="27" stop-index="37">
<owner name="dbo" start-index="27" stop-index="29"/>
<table-bound>
<original-database name="foo_db_1"/>
<original-schema name="dbo"/>
</table-bound>
</table>
</alter-index>
</sql-parser-test-cases>
21 changes: 21 additions & 0 deletions test/it/binder/src/test/resources/sqls/ddl/alter-index.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ 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.
-->

<sql-cases>
<sql-case id="alter_index_with_schema" value="ALTER INDEX idx_user_id ON dbo.t_order REBUILD" db-types="SQLServer" />
</sql-cases>

0 comments on commit b3e9a68

Please sign in to comment.