This is an automated email from the ASF dual-hosted git repository. chengzhang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new 922514b6c22 Fixes duplicate column names added when index changed in DDL (#33982) 922514b6c22 is described below commit 922514b6c22ed14c2136753c4d984730e2b64dad Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Tue Dec 10 10:50:03 2024 +0800 Fixes duplicate column names added when index changed in DDL (#33982) * Fix duplicate column names added when index changed in DDL * Fix duplicate column names added when index changed in DDL --- RELEASE-NOTES.md | 1 + .../metadata/data/loader/MySQLMetaDataLoader.java | 3 +-- .../index/AlterIndexStatementSchemaRefresher.java | 22 ++++++++++----------- .../index/CreateIndexStatementSchemaRefresher.java | 23 +++++++++++----------- .../index/DropIndexStatementSchemaRefresher.java | 22 ++++++++++----------- 5 files changed, 35 insertions(+), 36 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index b880b94df86..0f8f89e0dc5 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -35,6 +35,7 @@ ### Bug Fixes 1. Mode: Fixes `JDBCRepository` improper handling of H2-database in memory mode - [#33281](https://github.com/apache/shardingsphere/issues/33281) +1. Mode: Fixes duplicate column names added when index changed in DDL - [#33982](https://github.com/apache/shardingsphere/issues/33281) 1. SQL Binder: Fixes table does not exist exception when use HintManager#setDatabaseName to transparent - [#33370](https://github.com/apache/shardingsphere/pull/33370) 1. SQL Parser: Fixes LiteralExpressionSegment cast exception in SQL parser - [#33332](https://github.com/apache/shardingsphere/pull/33332) 1. SQL Parser: Fixes PostgreSQL and openGauss time extract function parse week and quarter error - [#33564](https://github.com/apache/shardingsphere/pull/33564) diff --git a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java index 492ccfed159..09cf576ec26 100644 --- a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java +++ b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java @@ -51,8 +51,7 @@ public final class MySQLMetaDataLoader implements DialectMetaDataLoader { private static final String ORDER_BY_ORDINAL_POSITION = " ORDER BY ORDINAL_POSITION"; private static final String TABLE_META_DATA_NO_ORDER = - "SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_KEY, EXTRA, COLLATION_NAME, ORDINAL_POSITION, COLUMN_TYPE, IS_NULLABLE FROM information_schema.columns " - + "WHERE TABLE_SCHEMA=?"; + "SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_KEY, EXTRA, COLLATION_NAME, ORDINAL_POSITION, COLUMN_TYPE, IS_NULLABLE FROM information_schema.columns WHERE TABLE_SCHEMA=?"; private static final String TABLE_META_DATA_SQL = TABLE_META_DATA_NO_ORDER + ORDER_BY_ORDINAL_POSITION; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java index f0501f1aff0..8e162d1ac7a 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java @@ -20,6 +20,9 @@ package org.apache.shardingsphere.mode.metadata.refresher.type.index; import com.google.common.base.Preconditions; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -48,11 +51,14 @@ public final class AlterIndexStatementSchemaRefresher implements MetaDataRefresh } String actualSchemaName = sqlStatement.getIndex().get().getOwner().map(optional -> optional.getIdentifier().getValue().toLowerCase()).orElse(schemaName); String indexName = sqlStatement.getIndex().get().getIndexName().getIdentifier().getValue(); - Optional<String> logicTableName = findLogicTableName(database.getSchema(actualSchemaName), indexName); + ShardingSpherePreconditions.checkState(database.containsSchema(actualSchemaName), () -> new SchemaNotFoundException(actualSchemaName)); + ShardingSphereSchema schema = database.getSchema(actualSchemaName); + Optional<String> logicTableName = findLogicTableName(schema, indexName); + // TODO define IndexNotFoundException Preconditions.checkState(logicTableName.isPresent(), "Can not find logic table by index '%s' of schema '%s'.", indexName, schemaName); - ShardingSphereTable table = database.getSchema(actualSchemaName).getTable(logicTableName.get()); - Preconditions.checkNotNull(table, "Can not get the table '%s' meta data!", logicTableName.get()); - ShardingSphereTable newTable = newShardingSphereTable(table); + ShardingSpherePreconditions.checkState(schema.containsTable(logicTableName.get()), () -> new TableNotFoundException(logicTableName.get())); + ShardingSphereTable table = schema.getTable(logicTableName.get()); + ShardingSphereTable newTable = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); newTable.removeIndex(indexName); String renameIndexName = renameIndex.get().getIndexName().getIdentifier().getValue(); newTable.putIndex(new ShardingSphereIndex(renameIndexName, new LinkedList<>(), false)); @@ -65,14 +71,6 @@ public final class AlterIndexStatementSchemaRefresher implements MetaDataRefresh return schema.getAllTables().stream().filter(each -> each.containsIndex(indexName)).findFirst().map(ShardingSphereTable::getName); } - private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) { - ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); - result.getColumnNames().addAll(table.getColumnNames()); - result.getVisibleColumns().addAll(table.getVisibleColumns()); - result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns()); - return result; - } - @Override public Class<AlterIndexStatement> getType() { return AlterIndexStatement.class; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java index aa1cfbfbe89..a09320e35c9 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java @@ -21,8 +21,12 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; @@ -44,23 +48,20 @@ public final class CreateIndexStatementSchemaRefresher implements MetaDataRefres String indexName = null == sqlStatement.getIndex() ? IndexMetaDataUtils.getGeneratedLogicIndexName(sqlStatement.getColumns()) : sqlStatement.getIndex().getIndexName().getIdentifier().getValue(); + // TODO define IndexNotFoundException Preconditions.checkArgument(!Strings.isNullOrEmpty(indexName), "Index name is not exist."); String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); - ShardingSphereTable table = newShardingSphereTable(database.getSchema(schemaName).getTable(tableName)); - table.putIndex(new ShardingSphereIndex(indexName, new LinkedList<>(), false)); + ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), () -> new SchemaNotFoundException(schemaName)); + ShardingSphereSchema schema = database.getSchema(schemaName); + ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); + ShardingSphereTable table = schema.getTable(tableName); + ShardingSphereTable newTable = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); + newTable.putIndex(new ShardingSphereIndex(indexName, new LinkedList<>(), false)); AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName); - alterSchemaMetaDataPOJO.getAlteredTables().add(table); + alterSchemaMetaDataPOJO.getAlteredTables().add(newTable); metaDataManagerPersistService.alterSchemaMetaData(alterSchemaMetaDataPOJO); } - private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) { - ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); - result.getColumnNames().addAll(table.getColumnNames()); - result.getVisibleColumns().addAll(table.getVisibleColumns()); - result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns()); - return result; - } - @Override public Class<CreateIndexStatement> getType() { return CreateIndexStatement.class; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java index b43444aa9bb..6006b26c8f3 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java @@ -19,8 +19,12 @@ package org.apache.shardingsphere.mode.metadata.refresher.type.index; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; @@ -48,10 +52,14 @@ public final class DropIndexStatementSchemaRefresher implements MetaDataRefreshe if (!logicTableName.isPresent()) { continue; } + ShardingSpherePreconditions.checkState(database.containsSchema(actualSchemaName), () -> new SchemaNotFoundException(schemaName)); + ShardingSphereSchema schema = database.getSchema(actualSchemaName); + ShardingSpherePreconditions.checkState(schema.containsTable(logicTableName.get()), () -> new TableNotFoundException(logicTableName.get())); + ShardingSphereTable table = schema.getTable(logicTableName.get()); + ShardingSphereTable newTable = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); + newTable.removeIndex(each.getIndexName().getIdentifier().getValue()); AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), actualSchemaName); - ShardingSphereTable table = newShardingSphereTable(database.getSchema(actualSchemaName).getTable(logicTableName.get())); - table.removeIndex(each.getIndexName().getIdentifier().getValue()); - alterSchemaMetaDataPOJO.getAlteredTables().add(table); + alterSchemaMetaDataPOJO.getAlteredTables().add(newTable); metaDataManagerPersistService.alterSchemaMetaData(alterSchemaMetaDataPOJO); } } @@ -65,14 +73,6 @@ public final class DropIndexStatementSchemaRefresher implements MetaDataRefreshe return tableNames.isEmpty() ? Optional.empty() : Optional.of(tableNames.iterator().next().getTableName()); } - private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) { - ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); - result.getColumnNames().addAll(table.getColumnNames()); - result.getVisibleColumns().addAll(table.getVisibleColumns()); - result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns()); - return result; - } - @Override public Class<DropIndexStatement> getType() { return DropIndexStatement.class;