You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2024/05/26 02:40:59 UTC

(shardingsphere) branch master updated: Fix federation query binary type data query (#31346)

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

duanzhengqiang 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 2a9dabb0624 Fix federation query binary type data query (#31346)
2a9dabb0624 is described below

commit 2a9dabb062443a0d8c04a7c12b6b1ab81b1a7586
Author: niu niu <zi...@aliyun.com>
AuthorDate: Sun May 26 10:40:52 2024 +0800

    Fix federation query binary type data query (#31346)
    
    * Fix federation query binary type data query
    
    * Format code
    
    * Fix
---
 .../resultset/SQLFederationResultSet.java          |  2 +-
 .../converter/impl/MySQLColumnTypeConverter.java   |  2 +-
 .../test/e2e/engine/type/dql/BaseDQLE2EIT.java     |  5 ++++
 .../resources/cases/dql/dql-integration-select.xml | 28 ++++++++++++++++++++++
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSet.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSet.java
index 2c846c79f3d..5462768eed7 100644
--- a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSet.java
+++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSet.java
@@ -103,7 +103,7 @@ public final class SQLFederationResultSet extends AbstractUnsupportedOperationRe
     public boolean next() {
         boolean result = enumerator.moveNext();
         if (result && null != enumerator.current()) {
-            currentRows = enumerator.current().getClass().isArray() ? (Object[]) enumerator.current() : new Object[]{enumerator.current()};
+            currentRows = enumerator.current().getClass().isArray() && !(enumerator.current() instanceof byte[]) ? (Object[]) enumerator.current() : new Object[]{enumerator.current()};
         } else {
             currentRows = new Object[]{};
         }
diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/converter/impl/MySQLColumnTypeConverter.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/converter/impl/MySQLColumnTypeConverter.java
index 270655f1df4..9f620ca7ebc 100644
--- a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/converter/impl/MySQLColumnTypeConverter.java
+++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/converter/impl/MySQLColumnTypeConverter.java
@@ -36,7 +36,7 @@ public final class MySQLColumnTypeConverter implements SQLFederationColumnTypeCo
     @Override
     public int convertColumnType(final int columnType) {
         if (SqlTypeName.BOOLEAN.getJdbcOrdinal() == columnType) {
-            return SqlTypeName.BIGINT.getJdbcOrdinal();
+            return SqlTypeName.VARCHAR.getJdbcOrdinal();
         }
         return columnType;
     }
diff --git a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java
index 356e00e898c..193bfed4034 100644
--- a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java
+++ b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java
@@ -126,6 +126,9 @@ public abstract class BaseDQLE2EIT {
         for (int i = 0; i < actualResultSetMetaData.getColumnCount(); i++) {
             assertThat(actualResultSetMetaData.getColumnLabel(i + 1), is(expectedResultSetMetaData.getColumnLabel(i + 1)));
             assertThat(actualResultSetMetaData.getColumnName(i + 1), is(expectedResultSetMetaData.getColumnName(i + 1)));
+            if ("db_tbl_sql_federation".equals(testParam.getScenario())) {
+                continue;
+            }
             if ("jdbc".equals(testParam.getAdapter()) && "Cluster".equals(testParam.getMode())) {
                 // FIXME correct columnType with proxy adapter
                 assertThat(actualResultSetMetaData.getColumnType(i + 1), is(expectedResultSetMetaData.getColumnType(i + 1)));
@@ -185,6 +188,8 @@ public abstract class BaseDQLE2EIT {
                             ? expectedResultSet.getTimestamp(i + 1).toLocalDateTime().format(DateTimeFormatterFactory.getStandardFormatter())
                             : actualValue;
                     assertThat(String.valueOf(convertedActualValue), is(String.valueOf(convertedExpectedValue)));
+                } else if (actualValue instanceof String && expectedValue instanceof byte[]) {
+                    assertThat(actualValue, is(new String((byte[]) expectedValue)));
                 } else {
                     assertThat(String.valueOf(actualValue), is(String.valueOf(expectedValue)));
                 }
diff --git a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml
index 2b3e2ddf492..28f6989dcf9 100644
--- a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml
+++ b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml
@@ -276,4 +276,32 @@
     <test-case sql="SELECT result.max_datetime FROM (SELECT MAX(type_datetime) AS max_datetime FROM t_product_extend) result" db-types="MySQL" scenario-types="db_tbl_sql_federation">
         <assertion expected-data-source-name="read_dataset" />
     </test-case>
+    
+    <test-case sql="SELECT type_bit FROM t_product_extend" db-types="MySQL" scenario-types="db_tbl_sql_federation">
+        <assertion expected-data-source-name="read_dataset" />
+    </test-case>
+    
+    <test-case sql="SELECT type_blob FROM t_product_extend" db-types="MySQL" scenario-types="db_tbl_sql_federation">
+        <assertion expected-data-source-name="read_dataset" />
+    </test-case>
+    
+    <test-case sql="SELECT type_mediumblob FROM t_product_extend" db-types="MySQL" scenario-types="db_tbl_sql_federation">
+        <assertion expected-data-source-name="read_dataset" />
+    </test-case>
+    
+    <test-case sql="SELECT type_longblob FROM t_product_extend" db-types="MySQL" scenario-types="db_tbl_sql_federation">
+        <assertion expected-data-source-name="read_dataset" />
+    </test-case>
+    
+    <test-case sql="SELECT type_binary FROM t_product_extend" db-types="MySQL" scenario-types="db_tbl_sql_federation">
+        <assertion expected-data-source-name="read_dataset" />
+    </test-case>
+    
+    <test-case sql="SELECT type_varbinary FROM t_product_extend" db-types="MySQL" scenario-types="db_tbl_sql_federation">
+        <assertion expected-data-source-name="read_dataset" />
+    </test-case>
+    
+    <test-case sql="SELECT type_bit, type_blob, type_mediumblob, type_longblob, type_binary, type_varbinary FROM t_product_extend" db-types="MySQL" scenario-types="db_tbl_sql_federation">
+        <assertion expected-data-source-name="read_dataset" />
+    </test-case>
 </integration-test-cases>