TaoPanfeng opened a new issue, #36425:
URL: https://github.com/apache/shardingsphere/issues/36425

   ## Bug Report
   ```
   @Data
   @TableName("student")
   public class StudentEntity implements Serializable {
   
       @TableId
       private Long id;// 主键
       private String name;// 名称
   
   }
   
   
       <select id="testMappingBug2" 
resultType="com.taopanfeng.shardingsphere.entity.StudentEntity">
           select * from (
                   select 'abc' as f2, s.* from student s
           ) tmp
       </select>
   
   
   
   output:DataIntegrityViolationException: Error attempting to get column 'id' 
from result set.  Cause: java.sql.SQLDataException: Cannot determine value type 
from string 'abc'
   ```
   
   
   ### Which version of ShardingSphere did you use?
   ### Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?
   ```
           <dependency>
               <groupId>org.apache.shardingsphere</groupId>
               
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
               <version>5.1.1</version>
           </dependency>
   ```
   
   ### Expected behavior
   
   ### Actual behavior : Error Information
   ```java
   org.springframework.dao.DataIntegrityViolationException: Error attempting to 
get column 'id' from result set.  Cause: java.sql.SQLDataException: Cannot 
determine value type from string 'abc'
   ; Cannot determine value type from string 'abc'; nested exception is 
java.sql.SQLDataException: Cannot determine value type from string 'abc'
        at 
org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:84)
        at 
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
        at 
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
        at 
org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
        at 
org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
        at jdk.proxy2/jdk.proxy2.$Proxy218.selectList(Unknown Source)
        at 
org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
        at 
com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)
        at 
com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)
        at 
com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)
        at 
com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
        at jdk.proxy2/jdk.proxy2.$Proxy219.testMappingBug3(Unknown Source)
        at com.taopanfeng.shardingsphere.AppTests.测试字段映射Bug(AppTests.java:53)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:569)
        at 
org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
        at 
org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
        at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
        at 
org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
        at 
org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
        at 
org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
        at 
org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
        at 
org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
        at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
        at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
        at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
        at 
org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
        at 
org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
        at 
org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
        at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)
        at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)
        at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
        at 
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
        at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
        at 
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
        at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
        at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
        at 
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
        at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
        at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
        at 
org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
        at 
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
        at 
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
        at 
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
        at 
org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
        at 
org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
        at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
        at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
        at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
        at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
        at 
org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
        at 
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
        at 
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
        at 
org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
        at 
org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
        at 
com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)
        at 
com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
        at 
com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
        at 
com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
        at 
com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
   Caused by: java.sql.SQLDataException: Cannot determine value type from 
string 'abc'
        at 
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:115)
        at 
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98)
        at 
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90)
        at 
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64)
        at 
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74)
        at 
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:96)
        at 
com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1431)
        at 
com.mysql.cj.jdbc.result.ResultSetImpl.getLong(ResultSetImpl.java:856)
        at 
com.zaxxer.hikari.pool.HikariProxyResultSet.getLong(HikariProxyResultSet.java)
        at 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.stream.JDBCStreamQueryResult.getValue(JDBCStreamQueryResult.java:65)
        at 
org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult.getValue(TransparentMergedResult.java:43)
        at 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet.getLong(ShardingSphereResultSet.java:166)
        at 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet.getLong(ShardingSphereResultSet.java:171)
        at 
org.apache.ibatis.type.LongTypeHandler.getNullableResult(LongTypeHandler.java:35)
        at 
org.apache.ibatis.type.LongTypeHandler.getNullableResult(LongTypeHandler.java:26)
        at 
org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:86)
        at 
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(DefaultResultSetHandler.java:586)
        at 
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:416)
        at 
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:366)
        at 
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:337)
        at 
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:310)
        at 
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202)
        at 
org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66)
        at 
org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
        at 
org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)
        at 
org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
        at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
        at 
org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
        at 
org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90)
        at 
org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
        at 
org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
        at 
org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:569)
        at 
org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)
        ... 77 more
   Caused by: com.mysql.cj.exceptions.DataConversionException: Cannot determine 
value type from string 'abc'
        at 
com.mysql.cj.result.AbstractNumericValueFactory.createFromBytes(AbstractNumericValueFactory.java:65)
        at 
com.mysql.cj.protocol.a.MysqlBinaryValueDecoder.decodeByteArray(MysqlBinaryValueDecoder.java:269)
        at 
com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:135)
        at 
com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:243)
        at 
com.mysql.cj.protocol.a.result.ByteArrayRow.getValue(ByteArrayRow.java:91)
        at 
com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1329)
        ... 107 more
   ```
   
   ### Reason analyze (If you can)
   ```
   ShardingSphereResultSet
   
       public ShardingSphereResultSet(final List<ResultSet> resultSets, final 
MergedResult mergeResultSet, final Statement statement, final ExecutionContext 
executionContext) throws SQLException {
           super(resultSets, statement, executionContext);
           this.mergeResultSet = mergeResultSet;
           // 这里的对应下标是错误的,导致后续根据下标取数据错误:例如 根据id的下标获取到了 f1 数据
           // The corresponding index here is incorrect, resulting in 
subsequent incorrect data retrieval based on the index: for example, f1 data 
was obtained based on the index of id
           columnLabelAndIndexMap = 
createColumnLabelAndIndexMap(resultSets.get(0).getMetaData());
       }
   ```
   
   ### Steps to reproduce the behavior, such as: SQL to execute, sharding rule 
configuration, when exception occur etc.
   
   ### Example codes for reproduce this issue (such as a github link).
   ```java
   @Data
   @TableName("student")
   public class StudentEntity implements Serializable {
   
       @TableId
       private Long id;
       private String name;
   
   }
   ```
   
   Bugs may occur in testMappingBug2 and testMappingBug3 here
   (这里的 testMappingBug2 和 testMappingBug3 会出现bug)
   ```xml
   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
   
   <mapper namespace="com.taopanfeng.shardingsphere.dao.StudentDao">
   
       <select id="testMappingBug" 
resultType="com.taopanfeng.shardingsphere.entity.StudentEntity">
           select 'abc' as f1, s.* from student s
       </select>
   
       <select id="testMappingBug2" 
resultType="com.taopanfeng.shardingsphere.entity.StudentEntity">
           select * from (
                   select 'abc' as f2, s.* from student s
           ) tmp
       </select>
   
       <select id="testMappingBug3" 
resultType="com.taopanfeng.shardingsphere.entity.StudentEntity">
           select tmp.* from (
                   select 'abc' as f3, s.* from student s
           ) tmp
       </select>
   
       <select id="testMappingBug4" 
resultType="com.taopanfeng.shardingsphere.entity.StudentEntity">
           select * from (
                   select  s.*, 'abc' as f4 from student s
           ) tmp
       </select>
       
   </mapper>
   ```
   
   ```java
       @Autowired
       private StudentDao studentDao;
   
       @Test
       void 测试字段映射Bug() {
           try {
               studentDao.testMappingBug();
           } catch (Exception e) {
               e.printStackTrace();
           }
           
System.out.println("===================================================1");
   
           try {
               studentDao.testMappingBug2();
           } catch (Exception e) {
               e.printStackTrace();
           }
           
System.out.println("===================================================2");
   
           try {
               studentDao.testMappingBug3();
           } catch (Exception e) {
               e.printStackTrace();
           }
           
System.out.println("===================================================3");
   
           try {
               studentDao.testMappingBug4();
           } catch (Exception e) {
               e.printStackTrace();
           }
           
System.out.println("===================================================4");
       }
   ```
   
   
   
   # my question
   ```
   1. It is said that 5.3.2 fixed this issue, but the springboot version does 
not have 5.3.2. If the base version is introduced, springboot cannot start.
   (据说是 5.3.2 修复了这个问题,但是 springboot 版本没有 5.3.2,如果引入了基础版本,springboot 则无法启动。)
          <dependency>
               <groupId>org.apache.shardingsphere</groupId>
               
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
               <version>5.1.1</version>
           </dependency>
   
   2. I commented on the following code and it will run normally. I'm worried 
that other bugs might occur as a result
   (我注释了下面的代码,就会正常执行,我担心会不会因此出现其他的bug)
   public final class ShardingSphereResultSet extends AbstractResultSetAdapter {
   
       private Map<String, Integer> createColumnLabelAndIndexMap(final 
ResultSetMetaData resultSetMetaData) throws SQLException {
           // if (hasSelectExpandProjections()) {
           //    return createColumnLabelAndIndexMapWithExpandProjections();
           // }
           Map<String, Integer> result = new 
CaseInsensitiveMap<>(resultSetMetaData.getColumnCount(), 1);
           for (int columnIndex = resultSetMetaData.getColumnCount(); 
columnIndex > 0; columnIndex--) {
               result.put(resultSetMetaData.getColumnLabel(columnIndex), 
columnIndex);
           }
           return result;
       }
   ```
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: 
[email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to