You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2024/12/10 02:50:10 UTC
(shardingsphere) branch master updated: Fixes duplicate column names added when index changed in DDL (#33982)
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 <zh...@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;