Issue 1:
Bug Report

For English only, other languages will not accept.

Before report a bug, make sure you have:

Searched open and closed GitHub issues.

Read documentation: ShardingSphere Doc.

Please pay attention on issues you submitted, because we maybe need more details.

If no response anymore and we cannot reproduce it on current information, we will close it.

Please answer these questions before submitting your issue. Thanks!

Which version of ShardingSphere did you use?

5.0.1-SNAPSHOT

master

commit 654c876

Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?

ShardingSphere-Proxy

Expected behavior

without error

Actual behavior

[ERROR] 2021-11-25 21:46:41.736 [epollEventLoopGroup-3-5] o.a.s.p.f.n.FrontendChannelInboundHandler - Exception occur:
java.lang.IndexOutOfBoundsException: readerIndex(1) + length(4) exceeds writerIndex(4): PooledSlicedByteBuf(ridx: 1, widx: 4, cap: 4/4, unwrapped: PooledUnsafeDirectByteBuf(ridx: 7, widx: 19, cap: 2048))
at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1442)
at io.netty.buffer.AbstractByteBuf.readIntLE(AbstractByteBuf.java:817)
at org.apache.shardingsphere.db.protocol.mysql.payload.MySQLPacketPayload.readInt4(MySQLPacketPayload.java:115)
at org.apache.shardingsphere.db.protocol.mysql.packet.handshake.MySQLHandshakeResponse41Packet.<init>(MySQLHandshakeResponse41Packet.java:56)
at org.apache.shardingsphere.proxy.frontend.mysql.authentication.MySQLAuthenticationEngine.authPhaseFastPath(MySQLAuthenticationEngine.java:88)
at org.apache.shardingsphere.proxy.frontend.mysql.authentication.MySQLAuthenticationEngine.authenticate(MySQLAuthenticationEngine.java:75)
at org.apache.shardingsphere.proxy.frontend.netty.FrontendChannelInboundHandler.authenticate(FrontendChannelInboundHandler.java:80)
at org.apache.shardingsphere.proxy.frontend.netty.FrontendChannelInboundHandler.channelRead(FrontendChannelInboundHandler.java:72)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:311)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:432)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
[ERROR] 2021-11-25 21:46:41.745 [epollEventLoopGroup-3-5] o.a.s.p.f.n.FrontendChannelInboundHandler - Exception occur:
java.lang.IndexOutOfBoundsException: readerIndex(1) + length(4) exceeds writerIndex(1): PooledSlicedByteBuf(ridx: 1, widx: 1, cap: 1/1, unwrapped: PooledUnsafeDirectByteBuf(ridx: 11, widx: 19, cap: 2048))
at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1442)
at io.netty.buffer.AbstractByteBuf.readIntLE(AbstractByteBuf.java:817)
at org.apache.shardingsphere.db.protocol.mysql.payload.MySQLPacketPayload.readInt4(MySQLPacketPayload.java:115)
at org.apache.shardingsphere.db.protocol.mysql.packet.handshake.MySQLHandshakeResponse41Packet.<init>(MySQLHandshakeResponse41Packet.java:56)
at org.apache.shardingsphere.proxy.frontend.mysql.authentication.MySQLAuthenticationEngine.authPhaseFastPath(MySQLAuthenticationEngine.java:88)
at org.apache.shardingsphere.proxy.frontend.mysql.authentication.MySQLAuthenticationEngine.authenticate(MySQLAuthenticationEngine.java:75)
at org.apache.shardingsphere.proxy.frontend.netty.FrontendChannelInboundHandler.authenticate(FrontendChannelInboundHandler.java:80)
at org.apache.shardingsphere.proxy.frontend.netty.FrontendChannelInboundHandler.channelRead(FrontendChannelInboundHandler.java:72)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:311)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:432)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)

Reason analyze (If you can)

Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.

https://hub.fastgit.org/pingcap/benchmarksql.git

5.0-mysql-support-opt-2.1

Example codes for reproduce this issue (such as a github link).

BenchmarkSQL with ShardingSphere-Proxy

BenchmarkSQL

https://hub.fastgit.org/pingcap/benchmarksql.git

5.0-mysql-support-opt-2.1

MySQL

Version：5.7.26 Port：3306

ShardingSphere-Proxy

https://github.com.cnpmjs.org/apache/shardingsphere.git

master

commit 654c876

About ShardingSphere-Proxy

server.yaml

rules:
- !AUTHORITY
users:
- root@%:root
- sharding@:sharding
provider:
type: NATIVE

props:
#max-connections-size-per-query: 1
#executor-size: 16 # Infinite by default.
#proxy-frontend-flush-threshold: 128 # The default value is 128.
#proxy-opentracing-enabled: false
#proxy-hint-enabled: false
#sql-show: false
#check-table-metadata-enabled: false
#lock-wait-timeout-milliseconds: 50000 # The maximum time to wait for a lock
# Proxy backend query fetch size. A larger value may increase the memory usage of ShardingSphere Proxy.
# The default value is -1, which means set the minimum value for different JDBC drivers.
#proxy-backend-query-fetch-size: 200
#check-duplicate-table-enabled: false
proxy-frontend-executor-size: 200 # Proxy frontend executor size. The default value is 0, which means let Netty decide.
# Available options of proxy backend executor suitable: OLAP(default), OLTP. The OLTP option may reduce time cost of writing packets to client, but it may increase the latency of SQL xecution
# if client connections are more than proxy-frontend-netty-executor-size, especially executing slow SQL.
proxy-backend-executor-suitable: OLTP

config-sharding.yaml

schemaName: proxy_tpcc
dataSources:
ds_0:
url: jdbc:mysql://IP.10.21:3306/tpcc0
username: root
password: Passwd
connectionTimeoutMilliseconds: 3000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 200
minPoolSize: 0
ds_1:
url: jdbc:mysql://IP.10.21:3306/tpcc1
username: root
password: Passwd
connectionTimeoutMilliseconds: 3000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 200
minPoolSize: 0
ds_2:
url: jdbc:mysql://IP.10.21:3306/tpcc2
username: root
password: Passwd
connectionTimeoutMilliseconds: 3000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 200
minPoolSize: 0
ds_3:
url: jdbc:mysql://IP.10.21:3306/tpcc3
username: root
password: Passwd
connectionTimeoutMilliseconds: 3000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 200
minPoolSize: 0
ds_4:
url: jdbc:mysql://IP.10.21:3306/tpcc4
username: root
password: Passwd
connectionTimeoutMilliseconds: 3000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 200
minPoolSize: 0

rules:
- !SHARDING
bindingTables:
# - bmsql_warehouse, bmsql_customer
# - bmsql_stock, bmsql_district, bmsql_order_line
- bmsql_district, bmsql_order_line
defaultDatabaseStrategy:
none: null
defaultTableStrategy:
none: null
keyGenerators:
snowflake:
props:
worker-id: 123
type: SNOWFLAKE
shardingAlgorithms:
ds_bmsql_customer_inline:
props:
algorithm-expression: ds_${c_id % 5}
type: INLINE
ds_bmsql_district_inline:
props:
algorithm-expression: ds_${d_w_id % 5}
type: INLINE
ds_bmsql_history_inline:
props:
algorithm-expression: ds_${h_w_id % 5}
type: INLINE
ds_bmsql_item_inline:
props:
algorithm-expression: ds_${i_id % 5}
type: INLINE
ds_bmsql_new_order_inline:
props:
algorithm-expression: ds_${no_w_id % 5}
type: INLINE
ds_bmsql_oorder_inline:
props:
algorithm-expression: ds_${o_w_id % 5}
type: INLINE
ds_bmsql_order_line_inline:
props:
algorithm-expression: ds_${ol_w_id % 5}
type: INLINE
ds_bmsql_stock_inline:
props:
algorithm-expression: ds_${s_w_id % 5}
type: INLINE
ds_bmsql_warehouse_inline:
props:
algorithm-expression: ds_${w_id % 5}
type: INLINE

t_bmsql_item:
type: INLINE
props:
algorithm-expression: bmsql_item_${i_im_id % 2}
t_bmsql_order_line:
type: INLINE
props:
algorithm-expression: bmsql_order_line_${ol_number % 6}

tables:
bmsql_config:
actualDataNodes: ds_0.bmsql_config
bmsql_customer:
actualDataNodes: ds_${0..4}.bmsql_customer
# tableStrategy:
# standard:
# shardingColumn: c_id
# shardingAlgorithmName: t_bmsql_customer
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_customer_inline
shardingColumn: c_id
bmsql_district:
actualDataNodes: ds_${0..4}.bmsql_district
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_district_inline
shardingColumn: d_w_id
bmsql_history:
actualDataNodes: ds_${0..4}.bmsql_history
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_history_inline
shardingColumn: h_w_id
bmsql_item:
actualDataNodes: ds_${0..4}.bmsql_item_${0..1}
tableStrategy:
standard:
shardingColumn: i_im_id
shardingAlgorithmName: t_bmsql_item
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_item_inline
shardingColumn: i_id
bmsql_new_order:
actualDataNodes: ds_${0..4}.bmsql_new_order
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_new_order_inline
shardingColumn: no_w_id
bmsql_oorder:
actualDataNodes: ds_${0..4}.bmsql_oorder
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_oorder_inline
shardingColumn: o_w_id
bmsql_order_line:
actualDataNodes: ds_${0..4}.bmsql_order_line_${0..5}
tableStrategy:
standard:
shardingColumn: ol_number
shardingAlgorithmName: t_bmsql_order_line
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_order_line_inline
shardingColumn: ol_w_id
bmsql_stock:
actualDataNodes: ds_${0..4}.bmsql_stock
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_stock_inline
shardingColumn: s_w_id
bmsql_warehouse:
actualDataNodes: ds_${0..4}.bmsql_warehouse
databaseStrategy:
standard:
shardingAlgorithmName: ds_bmsql_warehouse_inline
shardingColumn: w_id

bin/start.sh

SERVER_NAME=ShardingSphere-Proxy

cd `dirname $0`
cd ..
DEPLOY_DIR=`pwd`

LOGS_DIR=${DEPLOY_DIR}/logs
if [ ! -d ${LOGS_DIR} ]; then
mkdir ${LOGS_DIR}
fi

STDOUT_FILE=${LOGS_DIR}/stdout.log
EXT_LIB=${DEPLOY_DIR}/ext-lib

CLASS_PATH=.:${DEPLOY_DIR}/lib/*:${EXT_LIB}/*

JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "

JAVA_MEM_OPTS=" -server -Xmx16g -Xms16g -Xmn8g -Xss1m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "

MAIN_CLASS=org.apache.shardingsphere.proxy.Bootstrap

print_usage() {
echo "usage: start.sh [port] [config_dir]"
echo " port: proxy listen port, default is 3307"
echo " config_dir: proxy config directory, default is conf"
exit 0
}

if [ "$1" == "-h" ] || [ "$1" == "--help" ] ; then
print_usage
fi

echo "Starting the $SERVER_NAME ..."

if [ $# == 0 ]; then
CLASS_PATH=${DEPLOY_DIR}/conf:${CLASS_PATH}
fi

if [ $# == 1 ]; then
MAIN_CLASS=${MAIN_CLASS}" "$1
echo "The port is $1"
CLASS_PATH=${DEPLOY_DIR}/conf:${CLASS_PATH}
fi

if [ $# == 2 ]; then
MAIN_CLASS=${MAIN_CLASS}" "$1" "$2
echo "The port is $1"
echo "The configuration path is $DEPLOY_DIR/$2"
CLASS_PATH=${DEPLOY_DIR}/$2:${CLASS_PATH}
fi

echo "The classpath is ${CLASS_PATH}"

nohup java ${JAVA_OPTS} ${JAVA_MEM_OPTS} -classpath ${CLASS_PATH} ${MAIN_CLASS} >> ${STDOUT_FILE} 2>&1 &
sleep 1
echo "Please check the STDOUT file: $STDOUT_FILE"

About BenchmarkSQL

runDatabaseBuild.sh

#!/bin/sh

echo $(date "+%Y-%m-%d %H:%M:%S")

if [ $# -lt 1 ] ; then
echo "usage: $(basename $0) PROPS [OPT VAL [...]]" >&2
exit 2
fi

PROPS="$1"
shift
if [ ! -f "${PROPS}" ] ; then
echo "${PROPS}: no such file or directory" >&2
exit 1
fi
DB="$(grep '^db=' $PROPS | sed -e 's/^db=//')"

BEFORE_LOAD="tableCreates"
#AFTER_LOAD="indexCreates foreignKeys extraHistID buildFinish"
AFTER_LOAD="indexCreates buildFinish"
for step in ${BEFORE_LOAD} ; do
./runSQL.sh "${PROPS}" $step
done

./runLoader.sh "${PROPS}" $*

for step in ${AFTER_LOAD} ; do
./runSQL.sh "${PROPS}" $step
done

echo $(date "+%Y-%m-%d %H:%M:%S")

### props.proxy_mysql
db=mysql
driver=com.mysql.jdbc.Driver
conn=jdbc:mysql://IP.10.25:3307/proxy_tpcc?serverTimezone=UTC&useSSL=false&cachePrepStmts=true&prepStmtCacheSize=8000
user=root
password=root

warehouses=200
loadWorkers=200

terminals=200
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=10
//Number of total transactions per minute
limitTxnsPerMin=0

//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
terminalWarehouseFixed=true

//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
osCollectorScript=./misc/os_collector_linux.py
osCollectorInterval=1
//osCollectorSSHAddr=user@dbhost
osCollectorDevices=net_eth0 blk_sda

About MySQL

my.cnf

[mysqld]
server_id=13306
port =3306
basedir=/usr/local/mysql5.7
datadir=/data/mysql/mysql3306/data
log-error=/data/mysql/mysql3306/data/mysql.err
log_bin=/data/mysql/mysql3306/data/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
character_set_server = utf8mb4
pid-file=/data/mysql/mysql3306/data/mysql.pid
socket=/tmp/mysql3306.sock
max_connections=50000
expire_logs_days=1

innodb_buffer_pool_size=8000000000
###
innodb-log-file-size=2000000000
innodb-log-files-in-group=3
innodb-flush-log-at-trx-commit=0
innodb-change-buffer-max-size=40
back_log=900
#innodb_io_capacity
#innodb_io_capacity_max
innodb_max_dirty_pages_pct=75
innodb_open_files=20480
innodb_buffer_pool_instances=8
innodb_page_cleaners=8
innodb_purge_threads=2
innodb_read_io_threads=8
innodb_write_io_threads=8
table_open_cache=102400
#binlog_expire_logs_seconds=43200
binlog_format=mixed
log_timestamps=system
thread_cache_size=16384

### ds 准备
create database tpcc0 ;
create database tpcc1 ;
create database tpcc2 ;
create database tpcc3 ;
create database tpcc4 ;

BenchmarkSQL do

./runDatabaseDestroy.sh props.proxy_mysql
time ./runDatabaseBuild.sh props.proxy_mysql > 200test &

Issue 2:
Please answer these questions before submitting your issue. Thanks!

Which version of Sharding-Jdbc do you using?

1.4.2

Expected behavior

分页查询，select * from t_order limit 2,2 路由多个分片，只有一个分片有数据，查询4条记录

Actual behavior

应该只返回2条记录

Steps to reproduce the behavior

sharding-jdbc-example-mybatis这个demo工程中，增加测试类

`

package com.dangdang.ddframe.rdb.sharding.example.jdbc;

import com.dangdang.ddframe.rdb.sharding.example.jdbc.entity.Order;

import com.dangdang.ddframe.rdb.sharding.example.jdbc.repository.OrderRepository;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class Test {

public static void main(final String[] args) {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("META-INF/mybatisContext.xml");

OrderRepository orderRepository = applicationContext.getBean(OrderRepository.class);

List ls = orderRepository.selectAll();

System.out.println(ls);

}

}

`

修改OrderMapper.xml最后一个查询，增加limit

`

<select id="selectAll" resultMap="baseResultMap">
SELECT
<include refid="baseColumnList"/>
FROM `t_order` limit 2,2
</select>

修改数据库数据：

delete from ds_0.t_order_0;

delete from ds_0.t_order_1;

delete from ds_1.t_order_0;

delete from ds_1.t_order_1;

INSERT INTO ds_0.t_order_0 VALUES (1000, 10, 'INIT');

INSERT INTO ds_0.t_order_0 VALUES (1002, 10, 'INIT');

INSERT INTO ds_0.t_order_0 VALUES (1004, 10, 'INIT');

INSERT INTO ds_0.t_order_0 VALUES (1006, 10, 'INIT');

INSERT INTO ds_0.t_order_0 VALUES (1008, 10, 'INIT');

`

执行打印结果有4条记录：

[order_id: 1000, user_id: 10, status: INIT, order_id: 1002, user_id: 10, status: INIT, order_id: 1004, user_id: 10, status: INIT, order_id: 1006, user_id: 10, status: INIT]

调试代码发现，shardingJDBC在包装结果集时，根据mergeContext判断是不是要聚合，ResultSetFactory.getResultSet方法中

ShardingResultSets shardingResultSets = new ShardingResultSets(resultSets);

传入的resultSets有4个rs，获取到的shardingResultSets 只有一个，因为只有一个rs有数据，

ShardingResultSets.filterResultSets方法会过滤掉没有记录的rs

`

private List filterResultSets(final List resultSets) throws SQLException {

List result = new ArrayList<>(resultSets.size());

for (ResultSet each : resultSets) {

if (each.next()) {

result.add(new WrapperResultSet(each));

}

}

return result;

}

`

这样的话在shardingResultSets.getType()返回的是SINGLE

`

switch (shardingResultSets.getType()) {

case EMPTY:

return buildEmpty(resultSets);

case SINGLE:

return buildSingle(shardingResultSets);

case MULTIPLE:

return buildMultiple(shardingResultSets, mergeContext);

default:

throw new UnsupportedOperationException(shardingResultSets.getType().toString());

}

`

这样就不会去做合并结果集操作了

Please provide the reproduce example codes (such as github link) if possible.