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();
}