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" />