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>