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

zhonghongsheng 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 e5cf12d156f Fix wrong column label display when sql contains 
`COUNT(DISTINCT order_id)` (#21063)
e5cf12d156f is described below

commit e5cf12d156f2f540268fa4d2b1b26e776e4281d2
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Sep 20 18:02:27 2022 +0800

    Fix wrong column label display when sql contains `COUNT(DISTINCT order_id)` 
(#21063)
    
    * Fix wrong column label display when sql contains `COUNT(DISTINCT 
order_id)`
    
    * optimize logic
    
    * optimize logic of SQLFederationResultSet
    
    * remove --offline
---
 .github/workflows/it.yml                           |  2 +-
 .../core/task/InventoryIncrementalTasksRunner.java |  2 +-
 .../advanced/resultset/SQLFederationResultSet.java | 33 ++++++++++++++++------
 .../resultset/SQLFederationResultSetMetaData.java  | 28 +++++++++++-------
 .../optimizer/util/SQLFederationPlannerUtil.java   |  6 ++--
 .../schema/ViewMetaDataPersistServiceTest.java     |  4 +--
 .../cases/dql/dql-integration-test-cases.xml       |  5 ++--
 7 files changed, 52 insertions(+), 28 deletions(-)

diff --git a/.github/workflows/it.yml b/.github/workflows/it.yml
index 4d56d0b69f0..386a6e04c96 100644
--- a/.github/workflows/it.yml
+++ b/.github/workflows/it.yml
@@ -86,7 +86,7 @@ jobs:
       - name: Build IT image
         run: ./mvnw -B clean install -am -pl 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite
 -Pit.env.docker -DskipTests -Dspotless.apply.skip=true
       - name: Verify Suite CI Run
-        run: ./mvnw -B install -pl 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite
 -Dspotless.apply.skip=true --offline
+        run: ./mvnw -B install -pl 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite
 -Dspotless.apply.skip=true
       - name: Save IT image
         run: docker save -o /tmp/shardingsphere-proxy-test.tar 
apache/shardingsphere-proxy-test:latest
       - name: Upload IT image
diff --git 
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/task/InventoryIncrementalTasksRunner.java
 
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/task/InventoryIncrementalTasksRunner.java
index ce4b7ac6ef9..b741e9b1038 100644
--- 
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/task/InventoryIncrementalTasksRunner.java
+++ 
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/task/InventoryIncrementalTasksRunner.java
@@ -111,7 +111,7 @@ public final class InventoryIncrementalTasksRunner 
implements PipelineTasksRunne
     
     private ExecuteCallback createInventoryTaskCallback() {
         return new ExecuteCallback() {
-    
+            
             @Override
             public void onSuccess() {
                 if 
(PipelineJobProgressDetector.allInventoryTasksFinished(inventoryTasks)) {
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResultSet.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResultSet.java
index 134fb8a7e09..722e8f45100 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResultSet.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResultSet.java
@@ -17,12 +17,15 @@
 
 package org.apache.shardingsphere.sqlfederation.advanced.resultset;
 
-import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
 import org.apache.calcite.linq4j.Enumerator;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.schema.impl.AbstractSchema;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
+import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationDistinctProjection;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType;
+import 
org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.util.ResultSetUtil;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
@@ -62,7 +65,7 @@ public final class SQLFederationResultSet extends 
AbstractUnsupportedOperationRe
     
     private final Enumerator<Object> enumerator;
     
-    private final Map<String, Integer> columnLabelAndIndexMap;
+    private final Map<String, Integer> columnLabelAndIndexes;
     
     private final SQLFederationResultSetMetaData resultSetMetaData;
     
@@ -75,15 +78,29 @@ public final class SQLFederationResultSet extends 
AbstractUnsupportedOperationRe
     public SQLFederationResultSet(final Enumerator<Object> enumerator, final 
ShardingSphereSchema schema, final AbstractSchema filterableSchema,
                                   final SelectStatementContext 
selectStatementContext, final RelDataType validatedNodeType) {
         this.enumerator = enumerator;
-        columnLabelAndIndexMap = 
createColumnLabelAndIndexMap(selectStatementContext);
-        resultSetMetaData = new SQLFederationResultSetMetaData(schema, 
filterableSchema, new JavaTypeFactoryImpl(), selectStatementContext, 
validatedNodeType);
+        columnLabelAndIndexes = new 
HashMap<>(selectStatementContext.getProjectionsContext().getExpandProjections().size(),
 1);
+        Map<Integer, String> indexAndColumnLabels = new 
HashMap<>(selectStatementContext.getProjectionsContext().getExpandProjections().size(),
 1);
+        handleColumnLabelAndIndex(columnLabelAndIndexes, indexAndColumnLabels, 
selectStatementContext);
+        resultSetMetaData = new SQLFederationResultSetMetaData(schema, 
filterableSchema, selectStatementContext, validatedNodeType, 
indexAndColumnLabels);
     }
     
-    private Map<String, Integer> createColumnLabelAndIndexMap(final 
SelectStatementContext selectStatementContext) {
+    private void handleColumnLabelAndIndex(final Map<String, Integer> 
columnLabelAndIndexes, final Map<Integer, String> indexAndColumnLabels, final 
SelectStatementContext selectStatementContext) {
         List<Projection> projections = 
selectStatementContext.getProjectionsContext().getExpandProjections();
-        Map<String, Integer> result = new HashMap<>(projections.size(), 1);
         for (int columnIndex = 1; columnIndex <= projections.size(); 
columnIndex++) {
-            result.put(projections.get(columnIndex - 
1).getColumnLabel().toLowerCase(), columnIndex);
+            Projection projection = projections.get(columnIndex - 1);
+            String columnLabel = getColumnLabel(projection, 
selectStatementContext.getDatabaseType());
+            columnLabelAndIndexes.put(columnLabel.toLowerCase(), columnIndex);
+            indexAndColumnLabels.put(columnIndex, columnLabel);
+        }
+    }
+    
+    private String getColumnLabel(final Projection projection, final 
DatabaseType databaseType) {
+        String result;
+        if (projection instanceof AggregationDistinctProjection) {
+            boolean isPostgreSQLOpenGaussStatement = databaseType instanceof 
PostgreSQLDatabaseType || databaseType instanceof OpenGaussDatabaseType;
+            result = isPostgreSQLOpenGaussStatement ? 
((AggregationDistinctProjection) projection).getType().name() : 
projection.getExpression();
+        } else {
+            result = projection.getColumnLabel();
         }
         return result;
     }
@@ -445,7 +462,7 @@ public final class SQLFederationResultSet extends 
AbstractUnsupportedOperationRe
     }
     
     private Integer getIndexFromColumnLabelAndIndexMap(final String 
columnLabel) throws SQLException {
-        Integer result = columnLabelAndIndexMap.get(columnLabel.toLowerCase());
+        Integer result = columnLabelAndIndexes.get(columnLabel.toLowerCase());
         ShardingSpherePreconditions.checkNotNull(result, () -> new 
SQLFeatureNotSupportedException(String.format("can not get index from column 
label `%s`", columnLabel)));
         return result;
     }
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResultSetMetaData.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResul
 [...]
index faa5151cb4d..fb6777430f6 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResultSetMetaData.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-executor/shardingsphere-sql-federation-executor-advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/resultset/SQLFederationResultSetMetaData.java
@@ -17,12 +17,11 @@
 
 package org.apache.shardingsphere.sqlfederation.advanced.resultset;
 
-import lombok.RequiredArgsConstructor;
+import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.schema.Table;
 import org.apache.calcite.schema.impl.AbstractSchema;
-import org.apache.calcite.sql.type.SqlTypeName;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
@@ -37,7 +36,6 @@ import java.util.Optional;
 /**
  * SQL federation result set meta data.
  */
-@RequiredArgsConstructor
 public final class SQLFederationResultSetMetaData extends WrapperAdapter 
implements ResultSetMetaData {
     
     private final ShardingSphereSchema schema;
@@ -50,9 +48,21 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     private final RelDataType validatedNodeType;
     
+    private final Map<Integer, String> indexAndColumnLabels;
+    
+    public SQLFederationResultSetMetaData(final ShardingSphereSchema schema, 
final AbstractSchema filterableSchema,
+                                          final SelectStatementContext 
selectStatementContext, final RelDataType validatedNodeType, final Map<Integer, 
String> indexAndColumnLabels) {
+        this.schema = schema;
+        this.filterableSchema = filterableSchema;
+        this.relDataTypeFactory = new JavaTypeFactoryImpl();
+        this.selectStatementContext = selectStatementContext;
+        this.validatedNodeType = validatedNodeType;
+        this.indexAndColumnLabels = indexAndColumnLabels;
+    }
+    
     @Override
     public int getColumnCount() {
-        return 
selectStatementContext.getProjectionsContext().getExpandProjections().size();
+        return validatedNodeType.getFieldCount();
     }
     
     @Override
@@ -93,8 +103,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     @Override
     public String getColumnLabel(final int column) {
-        Projection projection = 
selectStatementContext.getProjectionsContext().getExpandProjections().get(column
 - 1);
-        return projection.getColumnLabel();
+        return indexAndColumnLabels.get(column);
     }
     
     @Override
@@ -103,7 +112,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
         if (projection instanceof ColumnProjection) {
             return ((ColumnProjection) projection).getName();
         }
-        return projection.getColumnLabel();
+        return getColumnLabel(column);
     }
     
     @Override
@@ -140,8 +149,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     @Override
     public String getColumnTypeName(final int column) {
-        int columnType = getColumnType(column);
-        return 
Optional.ofNullable(SqlTypeName.getNameForJdbcType(columnType)).map(SqlTypeName::getName).orElse("");
+        return validatedNodeType.getFieldList().get(column - 
1).getType().getSqlTypeName().getName();
     }
     
     @Override
@@ -161,7 +169,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     @Override
     public String getColumnClassName(final int column) {
-        return "";
+        return validatedNodeType.getFieldList().get(column - 
1).getType().getSqlTypeName().getClass().getName();
     }
     
     private Optional<String> findTableName(final int column) {
diff --git 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
index 1146a8e5ab9..c2f11ff2129 100644
--- 
a/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
+++ 
b/shardingsphere-kernel/shardingsphere-sql-federation/shardingsphere-sql-federation-optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/util/SQLFederationPlannerUtil.java
@@ -71,10 +71,10 @@ public final class SQLFederationPlannerUtil {
     private static final Map<String, SqlLibrary> DATABASE_TYPE_SQL_LIBRARIES = 
new HashMap<>();
     
     static {
-        DATABASE_TYPE_SQL_LIBRARIES.put(SqlLibrary.MYSQL.name().toLowerCase(), 
SqlLibrary.MYSQL);
-        
DATABASE_TYPE_SQL_LIBRARIES.put(SqlLibrary.POSTGRESQL.name().toLowerCase(), 
SqlLibrary.POSTGRESQL);
-        DATABASE_TYPE_SQL_LIBRARIES.put(SqlLibrary.ORACLE.name(), 
SqlLibrary.ORACLE);
+        DATABASE_TYPE_SQL_LIBRARIES.put("MySQL", SqlLibrary.MYSQL);
+        DATABASE_TYPE_SQL_LIBRARIES.put("PostgreSQL", SqlLibrary.POSTGRESQL);
         DATABASE_TYPE_SQL_LIBRARIES.put("openGauss", SqlLibrary.POSTGRESQL);
+        DATABASE_TYPE_SQL_LIBRARIES.put("Oracle", SqlLibrary.ORACLE);
     }
     
     /**
diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/config/schema/ViewMetaDataPersistServiceTest.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/config/schema/ViewMetaDataPersistServiceTest.java
index 9a81ccda4ad..dbf60af2eb7 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/config/schema/ViewMetaDataPersistServiceTest.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/config/schema/ViewMetaDataPersistServiceTest.java
@@ -49,8 +49,8 @@ public final class ViewMetaDataPersistServiceTest {
     public void assertPersist() {
         ShardingSphereView view = new ShardingSphereView("foo_view", "select 
`db`.`db`.`id` AS `id`,`db`.`db`.`order_id` AS `order_id` from `db`.`db`");
         new ViewMetaDataPersistService(repository).persist("foo_db", 
"foo_schema", Collections.singletonMap("foo_view", view));
-        
verify(repository).persist("/metadata/foo_db/schemas/foo_schema/views/foo_view",
 "name: foo_view" + System.lineSeparator() 
-                + "viewDefinition: select `db`.`db`.`id` AS 
`id`,`db`.`db`.`order_id` AS `order_id` from" + System.lineSeparator() 
+        
verify(repository).persist("/metadata/foo_db/schemas/foo_schema/views/foo_view",
 "name: foo_view" + System.lineSeparator()
+                + "viewDefinition: select `db`.`db`.`id` AS 
`id`,`db`.`db`.`order_id` AS `order_id` from" + System.lineSeparator()
                 + "  `db`.`db`" + System.lineSeparator());
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
index f052bca4320..68919251d5c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dql-integration-test-cases.xml
@@ -546,10 +546,9 @@
         <assertion parameters="10001:int" 
expected-data-source-name="read_dataset" />
     </test-case>
 
-    <!-- FIXME Expected: is "sum(distinct user_id)" but: was 
"aggregation_distinct_derived_0" -->
-    <!--<test-case sql="SELECT SUM(DISTINCT user_id), SUM(order_id_sharding) 
FROM t_order_federate_sharding WHERE order_id_sharding > ?" 
db-types="MySQL,PostgreSQL" scenario-types="tbl">
+    <test-case sql="SELECT SUM(DISTINCT user_id), SUM(order_id_sharding) FROM 
t_order_federate_sharding WHERE order_id_sharding > ?" 
db-types="MySQL,PostgreSQL" scenario-types="tbl">
         <assertion parameters="1000:int" />
-    </test-case>-->
+    </test-case>
     
     <test-case sql="SELECT (SELECT MAX(user_id) FROM 
t_order_federate_sharding) max_user_id, order_id_sharding, status FROM 
t_order_federate_sharding WHERE order_id_sharding > ?" 
db-types="MySQL,PostgreSQL" scenario-types="tbl">
         <assertion parameters="1100:int" />

Reply via email to