This is an automated email from the ASF dual-hosted git repository.
xiaoyu 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 2402416 Use raw ResultSet's metadata to generate query headers if
missing column metadata (#9076)
2402416 is described below
commit 2402416be4f784779a621496bfbae3b0240e51ab
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Jan 18 16:51:36 2021 +0800
Use raw ResultSet's metadata to generate query headers if missing column
metadata (#9076)
* Use raw ResultSet's metadata to generate Proxy query header if missing
column metadata
* fix related test cases
* Use raw ResultSet's metadata to generate JDBC query header if missing
column metadata
---
.github/workflows/it.yml | 2 +-
.../jdbc/adapter/AbstractResultSetAdapter.java | 15 ++++++-------
.../resultset/ShardingSphereResultSetMetaData.java | 26 +++++++++++++---------
.../communication/DatabaseCommunicationEngine.java | 7 +++++-
.../select_distinct_with_owner_star.xml | 3 +++
.../select_order_by_with_multiple_stars.xml | 6 +++++
.../replica_query/select_with_case_expression.xml | 3 +++
7 files changed, 41 insertions(+), 21 deletions(-)
diff --git a/.github/workflows/it.yml b/.github/workflows/it.yml
index aa0d5ba..18b37e5 100644
--- a/.github/workflows/it.yml
+++ b/.github/workflows/it.yml
@@ -19,7 +19,7 @@ name: Integration Test
on:
push:
- branches: [ master ]
+ branches: [ master, dev ]
pull_request:
branches: [ master ]
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
index 75ea60e..73d5816 100644
---
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
@@ -19,21 +19,20 @@ package org.apache.shardingsphere.driver.jdbc.adapter;
import com.google.common.base.Preconditions;
import lombok.Getter;
-import
org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement;
-import
org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement;
-import
org.apache.shardingsphere.driver.jdbc.unsupported.AbstractUnsupportedOperationResultSet;
import
org.apache.shardingsphere.driver.jdbc.adapter.executor.ForceExecuteTemplate;
import
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
import
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSetMetaData;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import
org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement;
+import
org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement;
+import
org.apache.shardingsphere.driver.jdbc.unsupported.AbstractUnsupportedOperationResultSet;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
-import java.util.Collection;
import java.util.List;
/**
@@ -63,13 +62,13 @@ public abstract class AbstractResultSetAdapter extends
AbstractUnsupportedOperat
@Override
public final ResultSetMetaData getMetaData() throws SQLException {
- return new
ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getRules(),
executionContext.getSqlStatementContext());
+ return new
ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(),
getShardingSphereMetaData(), executionContext.getSqlStatementContext());
}
- private Collection<ShardingSphereRule> getRules() {
+ private ShardingSphereMetaData getShardingSphereMetaData() {
ShardingSphereConnection connection = statement instanceof
ShardingSpherePreparedStatement
? ((ShardingSpherePreparedStatement)
statement).getConnection() : ((ShardingSphereStatement)
statement).getConnection();
- return
connection.getMetaDataContexts().getDefaultMetaData().getRuleMetaData().getRules();
+ return connection.getMetaDataContexts().getDefaultMetaData();
}
@Override
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
index 363421e..29ea1fd 100644
---
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
@@ -25,12 +25,12 @@ import
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.Col
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.database.DefaultSchema;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.type.DataNodeContainedRule;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
-import java.util.Collection;
import java.util.List;
import java.util.Optional;
@@ -42,18 +42,17 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
private final ResultSetMetaData resultSetMetaData;
- private final Collection<ShardingSphereRule> rules;
+ private final ShardingSphereMetaData shardingSphereMetaData;
- private final SQLStatementContext sqlStatementContext;
+ private final SQLStatementContext<?> sqlStatementContext;
@Override
public int getColumnCount() throws SQLException {
if (sqlStatementContext instanceof SelectStatementContext) {
- List<Projection> expandProjections = ((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections();
- if (expandProjections.isEmpty()) {
- return resultSetMetaData.getColumnCount();
+ if (hasSelectExpandProjections()) {
+ return ((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections().size();
}
- return expandProjections.size();
+ return resultSetMetaData.getColumnCount();
}
return resultSetMetaData.getColumnCount();
}
@@ -100,7 +99,7 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
@Override
public String getColumnName(final int column) throws SQLException {
- if (isHasSelectExpandProjections()) {
+ if (hasSelectExpandProjections()) {
List<Projection> actualProjections = ((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections();
if (column > actualProjections.size()) {
throw new
SQLException(SQLExceptionConstant.COLUMN_INDEX_OUT_OF_RANGE,
SQLExceptionConstant.OUT_OF_INDEX_SQL_STATE, 0);
@@ -113,8 +112,13 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
return resultSetMetaData.getColumnName(column);
}
- private boolean isHasSelectExpandProjections() {
- return sqlStatementContext instanceof SelectStatementContext &&
!((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections().isEmpty();
+ private boolean hasSelectExpandProjections() {
+ return sqlStatementContext instanceof SelectStatementContext
+ && !((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections().isEmpty()
&& containAllTablesWithColumnMetaData(sqlStatementContext);
+ }
+
+ private boolean containAllTablesWithColumnMetaData(final
SQLStatementContext<?> sqlStatementContext) {
+ return
sqlStatementContext.getTablesContext().getTableNames().stream().noneMatch(each
-> shardingSphereMetaData.getSchema().getAllColumnNames(each).isEmpty());
}
@Override
@@ -135,7 +139,7 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
@Override
public String getTableName(final int column) throws SQLException {
String actualTableName = resultSetMetaData.getTableName(column);
- Optional<ShardingSphereRule> rule = rules.stream().filter(each -> each
instanceof DataNodeContainedRule).findFirst();
+ Optional<ShardingSphereRule> rule =
shardingSphereMetaData.getRuleMetaData().getRules().stream().filter(each ->
each instanceof DataNodeContainedRule).findFirst();
return rule.isPresent() ? ((DataNodeContainedRule)
rule.get()).findLogicTableByActualTable(actualTableName).orElse(actualTableName)
: actualTableName;
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index dabef61..05defd9 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -180,7 +180,12 @@ public final class DatabaseCommunicationEngine {
}
private boolean hasSelectExpandProjections(final SQLStatementContext<?>
sqlStatementContext) {
- return sqlStatementContext instanceof SelectStatementContext &&
!((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections().isEmpty();
+ return sqlStatementContext instanceof SelectStatementContext
+ && !((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections().isEmpty()
&& containAllTablesWithColumnMetaData(sqlStatementContext);
+ }
+
+ private boolean containAllTablesWithColumnMetaData(final
SQLStatementContext<?> sqlStatementContext) {
+ return
sqlStatementContext.getTablesContext().getTableNames().stream().noneMatch(each
-> metaData.getSchema().getAllColumnNames(each).isEmpty());
}
private MergedResult mergeQuery(final SQLStatementContext<?>
sqlStatementContext, final List<QueryResult> queryResults) throws SQLException {
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_distinct_with_owner_star.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_distinct_with_owner_star.xml
index 9cf4f63..28f6f1a 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_distinct_with_owner_star.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_distinct_with_owner_star.xml
@@ -18,6 +18,9 @@
<dataset>
<metadata>
<column name="order_id" />
+ <column name="user_id" />
+ <column name="status" />
+ <column name="order_id" />
</metadata>
<row values="1000, 10, init_replica, 1000" />
<row values="1001, 10, init_replica, 1001" />
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_order_by_with_multiple_stars.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_order_by_with_multiple_stars.xml
index 086c918..47c6b04 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_order_by_with_multiple_stars.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_order_by_with_multiple_stars.xml
@@ -18,6 +18,12 @@
<dataset>
<metadata>
<column name="order_id" />
+ <column name="user_id" />
+ <column name="status" />
+ <column name="order_id" />
+ <column name="order_id" />
+ <column name="user_id" />
+ <column name="status" />
</metadata>
<row values="1000, 10, init_replica, 1000, 1000, 10, init_replica" />
<row values="1001, 10, init_replica, 1001, 1001, 10, init_replica" />
diff --git
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_with_case_expression.xml
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_with_case_expression.xml
index 236b95a..0ea1c8d 100644
---
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_with_case_expression.xml
+++
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dql/dataset/replica_query/select_with_case_expression.xml
@@ -19,6 +19,9 @@
<metadata>
<column name="order_id" />
<column name="user_id" />
+ <column name="status" />
+ <column name="item_id" />
+ <column name="stateName" />
</metadata>
<row values="1000,10,init_replica,100001,null" />
</dataset>