You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by xi...@apache.org on 2021/01/18 08:52:13 UTC
[shardingsphere] branch master updated: Use raw ResultSet's
metadata to generate query headers if missing column metadata (#9076)
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 <te...@163.com>
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>