This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 5a97f07  Fix: Duplicate data appears when querying 
information_schemata (#13904)
5a97f07 is described below

commit 5a97f07030d8cba5104fe8ee7ca1ed434d3477ad
Author: lanchengx <[email protected]>
AuthorDate: Fri Dec 3 09:32:08 2021 -0600

    Fix: Duplicate data appears when querying information_schemata (#13904)
    
    * Remove duplicate row.
    
    * Close ResultSet.
    
    * Modify the judgment condition.
---
 .../executor/AbstractDatabaseMetadataExecutor.java |  5 +++--
 .../SelectInformationSchemataExecutor.java         | 25 +++++++++++++++++++---
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
index 7c0ac10..40541cd 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/AbstractDatabaseMetadataExecutor.java
@@ -191,8 +191,9 @@ public abstract class AbstractDatabaseMetadataExecutor 
implements DatabaseAdminQ
             Optional<Entry<String, DataSource>> dataSourceEntry = 
resource.getDataSources().entrySet().stream().findFirst();
             log.info("Actual SQL: {} ::: {}", 
dataSourceEntry.orElseThrow(DatabaseNotExistedException::new).getKey(), sql);
             try (Connection conn = 
dataSourceEntry.get().getValue().getConnection();
-                 PreparedStatement ps = conn.prepareStatement(sql)) {
-                callback.apply(ps.executeQuery());
+                 PreparedStatement ps = conn.prepareStatement(sql);
+                 ResultSet resultSet = ps.executeQuery()) {
+                callback.apply(resultSet);
             }
         }
         
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
index 0cd2d2d..ec45e8e 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationSchemataExecutor.java
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.Identifi
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -57,12 +58,29 @@ public final class SelectInformationSchemataExecutor 
extends DefaultDatabaseMeta
     
     private final SelectStatement sqlStatement;
     
+    private String schemaNameAlias = SCHEMA_NAME;
+    
+    private boolean isQueryDatabase;
+    
     public SelectInformationSchemataExecutor(final SelectStatement 
sqlStatement, final String sql) {
         super(sql);
         this.sqlStatement = sqlStatement;
     }
     
     @Override
+    protected void createPreProcessing() {
+        removeDuplicatedRow();
+    }
+    
+    private void removeDuplicatedRow() {
+        if (isQueryDatabase) {
+            List<Map<String, Object>> reservedRow = 
getRows().stream().collect(Collectors.groupingBy(each -> 
each.get(schemaNameAlias), Collectors.toCollection(LinkedList::new)))
+                    
.values().stream().map(LinkedList::getFirst).collect(Collectors.toList());
+            reservedRow.forEach(each -> getRows().removeIf(row -> 
!getRows().contains(each)));
+        }
+    }
+    
+    @Override
     protected List<String> getSchemaNames() {
         Collection<String> schemaNames = 
ProxyContext.getInstance().getAllSchemaNames();
         SCHEMA_WITHOUT_DATA_SOURCE.addAll(schemaNames.stream().filter(each -> 
!AbstractDatabaseMetadataExecutor.hasDatasource(each)).collect(Collectors.toSet()));
@@ -77,10 +95,11 @@ public final class SelectInformationSchemataExecutor 
extends DefaultDatabaseMeta
     protected void rowPostProcessing(final String schemaName, final 
Map<String, Object> rowMap, final Map<String, String> aliasMap) {
         ShardingSphereResource resource = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(schemaName).getResource();
         Set<String> catalogs = 
resource.getDataSources().keySet().stream().map(each -> 
resource.getDataSourcesMetaData().getDataSourceMetaData(each).getCatalog()).collect(Collectors.toSet());
-        String alias = aliasMap.getOrDefault(SCHEMA_NAME, "");
-        String rowValue = rowMap.getOrDefault(alias, "").toString();
+        schemaNameAlias = aliasMap.getOrDefault(SCHEMA_NAME, "");
+        String rowValue = rowMap.getOrDefault(schemaNameAlias, "").toString();
+        isQueryDatabase = !rowValue.isEmpty();
         if (catalogs.contains(rowValue)) {
-            rowMap.replace(alias, schemaName);
+            rowMap.replace(schemaNameAlias, schemaName);
         } else {
             rowMap.clear();
         }

Reply via email to