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;

Reply via email to