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 2023/06/08 07:45:42 UTC

[shardingsphere] branch master updated: Fix the exception thrown when invoking ShardingSphereResultSet#getCharacterStream with CLOB type while using Oracle database. (#26093) (#26094)

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 7566dde5818 Fix the exception thrown when invoking ShardingSphereResultSet#getCharacterStream with CLOB type while using Oracle database. (#26093) (#26094)
7566dde5818 is described below

commit 7566dde581865a01b3e51825941bb7883837e959
Author: Cong Hu <ia...@qq.com>
AuthorDate: Thu Jun 8 15:45:35 2023 +0800

    Fix the exception thrown when invoking ShardingSphereResultSet#getCharacterStream with CLOB type while using Oracle database. (#26093) (#26094)
    
    * Fix the exception thrown when invoking ShardingSphereResultSet#getCharacterStream with CLOB type while using Oracle database. (#26093)
    
    * Fix the exception thrown when invoking ShardingSphereResultSet#getCharacterStream with CLOB type while using Oracle database. (#26093)
    
    * retrigger checks
---
 .../encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java |  6 ++++++
 .../merge/dal/show/EncryptShowCreateTableMergedResult.java     |  6 ++++++
 .../shardingsphere/encrypt/merge/dql/EncryptMergedResult.java  |  6 ++++++
 .../encrypt/merge/dql/EncryptMergedResultTest.java             |  8 ++++++++
 .../apache/shardingsphere/mask/merge/dql/MaskMergedResult.java |  6 ++++++
 .../shardingsphere/mask/merge/dql/MaskMergedResultTest.java    |  8 ++++++++
 .../infra/executor/sql/execute/result/query/QueryResult.java   | 10 ++++++++++
 .../impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java    |  6 ++++++
 .../result/query/type/memory/AbstractMemoryQueryResult.java    | 10 ++++++++++
 .../driver/jdbc/type/stream/JDBCStreamQueryResultTest.java     |  9 +++++++++
 .../apache/shardingsphere/infra/merge/result/MergedResult.java | 10 ++++++++++
 .../merge/result/impl/decorator/DecoratorMergedResult.java     |  6 ++++++
 .../infra/merge/result/impl/local/LocalDataMergedResult.java   |  6 ++++++
 .../infra/merge/result/impl/memory/MemoryMergedResult.java     |  5 +++++
 .../infra/merge/result/impl/stream/StreamMergedResult.java     |  8 ++++++++
 .../merge/result/impl/transparent/TransparentMergedResult.java |  6 ++++++
 .../merge/result/impl/local/LocalDataMergedResultTest.java     |  7 +++++++
 .../result/impl/transparent/TransparentMergedResultTest.java   | 10 ++++++++++
 .../driver/jdbc/core/resultset/ShardingSphereResultSet.java    |  3 ++-
 .../driver/jdbc/adapter/ResultSetGetterAdapterTest.java        | 10 +++++++---
 .../jdbc/core/resultset/ShardingSphereResultSetTest.java       |  4 ++--
 21 files changed, 144 insertions(+), 6 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
index a49054fece7..1ff7ac08fef 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
@@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Calendar;
@@ -94,6 +95,11 @@ public abstract class EncryptShowColumnsMergedResult implements MergedResult {
         throw new SQLFeatureNotSupportedException("");
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        throw new SQLFeatureNotSupportedException("");
+    }
+    
     protected abstract boolean nextValue() throws SQLException;
     
     protected abstract Object getOriginalValue(int columnIndex, Class<?> type) throws SQLException;
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
index d8c4d210527..f80cc9c703d 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowCreateTableMergedResult.java
@@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Calendar;
@@ -105,6 +106,11 @@ public abstract class EncryptShowCreateTableMergedResult implements MergedResult
         throw new SQLFeatureNotSupportedException("");
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        throw new SQLFeatureNotSupportedException("");
+    }
+    
     protected abstract boolean nextValue() throws SQLException;
     
     protected abstract Object getOriginalValue(int columnIndex, Class<?> type) throws SQLException;
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
index 6bc4ce2d890..1f59aba4349 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.encrypt.api.context.EncryptContext;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 import java.util.Optional;
@@ -67,6 +68,11 @@ public final class EncryptMergedResult implements MergedResult {
         return mergedResult.getInputStream(columnIndex, type);
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        return mergedResult.getCharacterStream(columnIndex);
+    }
+    
     @Override
     public boolean wasNull() throws SQLException {
         return mergedResult.wasNull();
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
index 047d903db5c..34124e20248 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
@@ -24,6 +24,7 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 import java.util.Date;
@@ -70,6 +71,13 @@ class EncryptMergedResultTest {
         assertThat(new EncryptMergedResult(metaData, mergedResult).getInputStream(1, "asc"), is(inputStream));
     }
     
+    @Test
+    void assertGetCharacterStream() throws SQLException {
+        Reader reader = mock(Reader.class);
+        when(mergedResult.getCharacterStream(1)).thenReturn(reader);
+        assertThat(new EncryptMergedResult(metaData, mergedResult).getCharacterStream(1), is(reader));
+    }
+    
     @Test
     void assertWasNull() throws SQLException {
         assertFalse(new EncryptMergedResult(metaData, mergedResult).wasNull());
diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java
index 04b4ca8a9cf..8912bd3be34 100644
--- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java
+++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResult.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.mask.spi.MaskAlgorithm;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 import java.util.Optional;
@@ -62,6 +63,11 @@ public final class MaskMergedResult implements MergedResult {
         return mergedResult.getInputStream(columnIndex, type);
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        return mergedResult.getCharacterStream(columnIndex);
+    }
+    
     @Override
     public boolean wasNull() throws SQLException {
         return mergedResult.wasNull();
diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java
index 0deac1219d9..0af3e0ed0e7 100644
--- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java
+++ b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskMergedResultTest.java
@@ -25,6 +25,7 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 import java.util.Date;
@@ -73,6 +74,13 @@ class MaskMergedResultTest {
         assertThat(new MaskMergedResult(metaData, mergedResult).getInputStream(1, "asc"), is(inputStream));
     }
     
+    @Test
+    void assertGetCharacterStream() throws SQLException {
+        Reader reader = mock(Reader.class);
+        when(mergedResult.getCharacterStream(1)).thenReturn(reader);
+        assertThat(new MaskMergedResult(metaData, mergedResult).getCharacterStream(1), is(reader));
+    }
+    
     @Test
     void assertWasNull() throws SQLException {
         assertFalse(new MaskMergedResult(metaData, mergedResult).wasNull());
diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/QueryResult.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/QueryResult.java
index 99eabddaf13..e2a8460702d 100644
--- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/QueryResult.java
+++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/QueryResult.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.executor.sql.execute.result.query;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.ExecuteResult;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 
@@ -67,6 +68,15 @@ public interface QueryResult extends ExecuteResult, AutoCloseable {
      */
     InputStream getInputStream(int columnIndex, String type) throws SQLException;
     
+    /**
+     * Get CharacterStream.
+     *
+     * @param columnIndex column index
+     * @return reader
+     * @throws SQLException SQL exception
+     */
+    Reader getCharacterStream(int columnIndex) throws SQLException;
+    
     /**
      * Judge result set is null or not.
      *
diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java
index 60663208772..bcfaba882b1 100644
--- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java
+++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResult.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.dr
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.stream.AbstractStreamQueryResult;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.math.BigDecimal;
 import java.sql.Array;
 import java.sql.Blob;
@@ -135,6 +136,11 @@ public final class JDBCStreamQueryResult extends AbstractStreamQueryResult {
         }
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        return resultSet.getCharacterStream(columnIndex);
+    }
+    
     @Override
     public boolean wasNull() throws SQLException {
         return resultSet.wasNull();
diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/type/memory/AbstractMemoryQueryResult.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/type/memory/AbstractMemoryQueryResult.java
index e37f906a809..0a92070ea4f 100644
--- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/type/memory/AbstractMemoryQueryResult.java
+++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/type/memory/AbstractMemoryQueryResult.java
@@ -23,11 +23,15 @@ import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryRe
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
 
+import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.ObjectOutputStream;
+import java.io.Reader;
+import java.sql.SQLException;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Iterator;
@@ -98,6 +102,12 @@ public abstract class AbstractMemoryQueryResult implements QueryResult {
         return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        // TODO Support connection property character encoding
+        return new BufferedReader(new InputStreamReader(getInputStream(columnIndex)));
+    }
+    
     @Override
     public final boolean wasNull() {
         return wasNull;
diff --git a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResultTest.java b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResultTest.java
index 7e3076541dc..9353519f6e6 100644
--- a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResultTest.java
+++ b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/driver/jdbc/type/stream/JDBCStreamQueryResultTest.java
@@ -237,6 +237,15 @@ class JDBCStreamQueryResultTest {
         assertThrows(SQLException.class, () -> queryResult.getInputStream(1, "Unsupported Type"));
     }
     
+    @Test
+    void assertGetCharacterStream() throws SQLException {
+        ResultSet resultSet = getResultSet();
+        JDBCStreamQueryResult queryResult = new JDBCStreamQueryResult(resultSet);
+        queryResult.next();
+        queryResult.getCharacterStream(1);
+        verify(resultSet).getCharacterStream(1);
+    }
+    
     @Test
     void assertWasNull() throws SQLException {
         JDBCStreamQueryResult queryResult = new JDBCStreamQueryResult(getResultSet());
diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/MergedResult.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/MergedResult.java
index ac31372f71e..d7f4610f2b0 100644
--- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/MergedResult.java
+++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/MergedResult.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.infra.merge.result;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 
@@ -65,6 +66,15 @@ public interface MergedResult {
      */
     InputStream getInputStream(int columnIndex, String type) throws SQLException;
     
+    /**
+     * Get CharacterStream.
+     *
+     * @param columnIndex column index
+     * @return Reader
+     * @throws SQLException SQL exception
+     */
+    Reader getCharacterStream(int columnIndex) throws SQLException;
+    
     /**
      * Judge ResultSet is null or not.
      * 
diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/decorator/DecoratorMergedResult.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/decorator/DecoratorMergedResult.java
index e36d18a914c..7a00e7117f9 100644
--- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/decorator/DecoratorMergedResult.java
+++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/decorator/DecoratorMergedResult.java
@@ -22,6 +22,7 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 
@@ -49,6 +50,11 @@ public abstract class DecoratorMergedResult implements MergedResult {
         return mergedResult.getInputStream(columnIndex, type);
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        return mergedResult.getCharacterStream(columnIndex);
+    }
+    
     @Override
     public final boolean wasNull() throws SQLException {
         return mergedResult.wasNull();
diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResult.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResult.java
index 220bfc6bc63..d615f66ed97 100644
--- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResult.java
+++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResult.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.merge.result.impl.local;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Calendar;
@@ -63,6 +64,11 @@ public final class LocalDataMergedResult implements MergedResult {
         throw new SQLFeatureNotSupportedException("getInputStream");
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        throw new SQLFeatureNotSupportedException("getCharacterStream");
+    }
+    
     @Override
     public boolean wasNull() {
         return null == currentRow;
diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/memory/MemoryMergedResult.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/memory/MemoryMergedResult.java
index ff3b0b06bd3..526c5f5e683 100644
--- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/memory/MemoryMergedResult.java
+++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/memory/MemoryMergedResult.java
@@ -93,6 +93,11 @@ public abstract class MemoryMergedResult<T extends ShardingSphereRule> implement
         throw new SQLFeatureNotSupportedException(String.format("Get input stream from `%s`", type));
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        throw new SQLFeatureNotSupportedException("Get Character stream");
+    }
+    
     @Override
     public final boolean wasNull() {
         return wasNull;
diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/stream/StreamMergedResult.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/stream/StreamMergedResult.java
index 44f65a8d3be..4d70c7ce3ad 100644
--- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/stream/StreamMergedResult.java
+++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/stream/StreamMergedResult.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 
@@ -62,6 +63,13 @@ public abstract class StreamMergedResult implements MergedResult {
         return result;
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        Reader result = getCurrentQueryResult().getCharacterStream(columnIndex);
+        wasNull = getCurrentQueryResult().wasNull();
+        return result;
+    }
+    
     @Override
     public final boolean wasNull() {
         return wasNull;
diff --git a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResult.java b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResult.java
index b24eb533c80..db55ad768ed 100644
--- a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResult.java
+++ b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResult.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryRe
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.SQLException;
 import java.util.Calendar;
 
@@ -53,6 +54,11 @@ public final class TransparentMergedResult implements MergedResult {
         return queryResult.getInputStream(columnIndex, type);
     }
     
+    @Override
+    public Reader getCharacterStream(final int columnIndex) throws SQLException {
+        return queryResult.getCharacterStream(columnIndex);
+    }
+    
     @Override
     public boolean wasNull() throws SQLException {
         return queryResult.wasNull();
diff --git a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResultTest.java b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResultTest.java
index 2f6ea41dc4b..1f50709a14d 100644
--- a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResultTest.java
+++ b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/local/LocalDataMergedResultTest.java
@@ -64,6 +64,13 @@ class LocalDataMergedResultTest {
         assertThrows(SQLFeatureNotSupportedException.class, () -> actual.getInputStream(1, "Ascii"));
     }
     
+    @Test
+    void assertGetCharacterStream() {
+        List<Object> row = Collections.singletonList("value");
+        LocalDataMergedResult actual = new LocalDataMergedResult(Collections.singletonList(new LocalDataQueryResultRow(row)));
+        assertThrows(SQLFeatureNotSupportedException.class, () -> actual.getCharacterStream(1));
+    }
+    
     @Test
     void assertWasNull() {
         List<Object> row = Collections.singletonList("value");
diff --git a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResultTest.java b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResultTest.java
index 138de553654..6cc7a9d733f 100644
--- a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResultTest.java
+++ b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/result/impl/transparent/TransparentMergedResultTest.java
@@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryRe
 import org.junit.jupiter.api.Test;
 
 import java.io.InputStream;
+import java.io.Reader;
 import java.sql.Date;
 import java.sql.SQLException;
 
@@ -67,6 +68,15 @@ class TransparentMergedResultTest {
         assertThat(actual.getInputStream(1, "Ascii"), is(value));
     }
     
+    @Test
+    void assertGetCharacterStream() throws SQLException {
+        QueryResult queryResult = mock(QueryResult.class);
+        Reader value = mock(Reader.class);
+        when(queryResult.getCharacterStream(1)).thenReturn(value);
+        TransparentMergedResult actual = new TransparentMergedResult(queryResult);
+        assertThat(actual.getCharacterStream(1), is(value));
+    }
+    
     @Test
     void assertWasNull() throws SQLException {
         TransparentMergedResult actual = new TransparentMergedResult(mock(QueryResult.class));
diff --git a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java
index 6d93ec9babd..9d6ec2c9146 100644
--- a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java
+++ b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java
@@ -298,7 +298,8 @@ public final class ShardingSphereResultSet extends AbstractResultSetAdapter {
     
     @Override
     public Reader getCharacterStream(final int columnIndex) throws SQLException {
-        return (Reader) mergeResultSet.getValue(columnIndex, Reader.class);
+        // TODO To be supported: encrypt, mask, and so on
+        return mergeResultSet.getCharacterStream(columnIndex);
     }
     
     @Override
diff --git a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java
index 44bba35cc24..8055db2578f 100644
--- a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java
+++ b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.driver.jdbc.adapter;
 
 import org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.junit.jupiter.api.Test;
@@ -343,7 +344,7 @@ class ResultSetGetterAdapterTest {
     void assertGetCharacterStreamForColumnIndex() throws SQLException {
         Reader reader = mock(Reader.class);
         MergedResult mergedResult = mock(MergedResult.class);
-        when(mergedResult.getValue(1, Reader.class)).thenReturn(reader);
+        when(mergedResult.getCharacterStream(1)).thenReturn(reader);
         assertThat(mockShardingSphereResultSet(mergedResult).getCharacterStream(1), is(reader));
     }
     
@@ -351,7 +352,7 @@ class ResultSetGetterAdapterTest {
     void assertGetCharacterStreamForColumnLabel() throws SQLException {
         Reader reader = mock(Reader.class);
         MergedResult mergedResult = mock(MergedResult.class);
-        when(mergedResult.getValue(1, Reader.class)).thenReturn(reader);
+        when(mergedResult.getCharacterStream(1)).thenReturn(reader);
         assertThat(mockShardingSphereResultSet(mergedResult).getCharacterStream("col"), is(reader));
     }
     
@@ -439,6 +440,9 @@ class ResultSetGetterAdapterTest {
         ResultSet resultSet = mock(ResultSet.class);
         when(resultSetMetaData.getColumnCount()).thenReturn(1);
         when(resultSet.getMetaData()).thenReturn(resultSetMetaData);
-        return new ShardingSphereResultSet(Collections.singletonList(resultSet), mergedResult, mock(Statement.class), true, mock(ExecutionContext.class));
+        SQLStatementContext sqlStatementContext = mock(SQLStatementContext.class);
+        ExecutionContext executionContext = mock(ExecutionContext.class);
+        when(executionContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
+        return new ShardingSphereResultSet(Collections.singletonList(resultSet), mergedResult, mock(Statement.class), true, executionContext);
     }
 }
diff --git a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java
index 6e9784599f5..7956854a5cd 100644
--- a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java
+++ b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java
@@ -391,14 +391,14 @@ class ShardingSphereResultSetTest {
     @Test
     void assertGetCharacterStreamWithColumnIndex() throws SQLException {
         Reader reader = mock(Reader.class);
-        when(mergeResultSet.getValue(1, Reader.class)).thenReturn(reader);
+        when(mergeResultSet.getCharacterStream(1)).thenReturn(reader);
         assertThat(shardingSphereResultSet.getCharacterStream(1), is(reader));
     }
     
     @Test
     void assertGetCharacterStreamWithColumnLabel() throws SQLException {
         Reader reader = mock(Reader.class);
-        when(mergeResultSet.getValue(1, Reader.class)).thenReturn(reader);
+        when(mergeResultSet.getCharacterStream(1)).thenReturn(reader);
         assertThat(shardingSphereResultSet.getCharacterStream("label"), is(reader));
     }