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

zhangliang 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 a6685e74777 Clear current batch generatedKeys ResultSet (#37204)
a6685e74777 is described below

commit a6685e74777a28058c8d0554f55c941304e10f09
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Nov 28 13:15:54 2025 +0800

    Clear current batch generatedKeys ResultSet (#37204)
    
    * Clear current batch generatedKeys ResultSet
    
    * Clear current batch generatedKeys ResultSet
    
    * Clear current batch generatedKeys ResultSet
---
 RELEASE-NOTES.md                                   |  1 +
 .../statement/ShardingSpherePreparedStatement.java | 12 ++++
 .../ShardingSpherePreparedStatementTest.java       | 76 ++++++++++++++++++++++
 src/resources/idea/inspections.xml                 |  1 -
 .../statement/ShardingPreparedStatementTest.java   | 37 ++++++-----
 5 files changed, 108 insertions(+), 19 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index a9307fd8e6e..972d6dfeaa7 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -89,6 +89,7 @@
 1. JDBC: Support set data source properties type with java.time.Duration - 
[#35241](https://github.com/apache/shardingsphere/pull/35241)
 1. JDBC: Resolve statement manager leaks when creating multiple statements - 
[#35665](https://github.com/apache/shardingsphere/pull/35665)
 1. JDBC: Fix the issue where cached connections in 
DriverDatabaseConnectionManager were not released in time - 
[35834](https://github.com/apache/shardingsphere/pull/35834)
+1. JDBC: Clear batch generated keys result set when call clearBatch method - 
[37204](https://github.com/apache/shardingsphere/pull/37204)
 1. Proxy: Fix `SHOW PROCESSLIST` not wait for all nodes - 
[#35348](https://github.com/apache/shardingsphere/pull/35348)
 1. Proxy: Fix NoSuchElementException exception when execute MySQL SHOW 
VARIABLES without current database - 
[#35550](https://github.com/apache/shardingsphere/pull/35550)
 1. Proxy: Fix column length for PostgreSQL string binary protocol value - 
[35840](https://github.com/apache/shardingsphere/pull/35840)
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 9a54939b0c9..578a42b3193 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -349,10 +349,22 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
     @Override
     public void clearBatch() {
         currentResultSet = null;
+        closeCurrentBatchGeneratedKeysResultSet();
         executeBatchExecutor.clear();
         clearParameters();
     }
     
+    private void closeCurrentBatchGeneratedKeysResultSet() {
+        if (null != currentBatchGeneratedKeysResultSet) {
+            try {
+                currentBatchGeneratedKeysResultSet.close();
+            } catch (final SQLException ignored) {
+            } finally {
+                currentBatchGeneratedKeysResultSet = null;
+            }
+        }
+    }
+    
     @SuppressWarnings("MagicConstant")
     @Override
     public int getResultSetType() {
diff --git 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
new file mode 100644
index 00000000000..ab4880bee54
--- /dev/null
+++ 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.driver.jdbc.core.statement;
+
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
+import 
org.apache.shardingsphere.driver.jdbc.core.resultset.GeneratedKeysResultSet;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
+import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
+import 
org.apache.shardingsphere.sqlfederation.rule.builder.DefaultSQLFederationRuleConfigurationBuilder;
+import org.junit.jupiter.api.Test;
+import org.mockito.internal.configuration.plugins.Plugins;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class ShardingSpherePreparedStatementTest {
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    void assertClearBatchResetsCachedGeneratedKeysResultSet() throws 
SQLException, ReflectiveOperationException {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "SQL92"));
+        when(database.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.emptyList()));
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        when(metaData.getDatabase("foo_db")).thenReturn(database);
+        when(metaData.getGlobalRuleMetaData()).thenReturn(new 
RuleMetaData(Arrays.asList(
+                new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()),
+                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), 
Collections.emptyList()))));
+        when(metaData.getProps()).thenReturn(new ConfigurationProperties(new 
Properties()));
+        ShardingSphereConnection connection = 
mock(ShardingSphereConnection.class, RETURNS_DEEP_STUBS);
+        
when(connection.getContextManager().getMetaDataContexts().getMetaData()).thenReturn(metaData);
+        when(connection.getCurrentDatabaseName()).thenReturn("foo_db");
+        ShardingSpherePreparedStatement preparedStatement = new 
ShardingSpherePreparedStatement(connection, "SELECT 1", 
Statement.RETURN_GENERATED_KEYS);
+        ResultSet cachedResultSet = new GeneratedKeysResultSet();
+        
Plugins.getMemberAccessor().set(ShardingSpherePreparedStatement.class.getDeclaredField("currentBatchGeneratedKeysResultSet"),
 preparedStatement, cachedResultSet);
+        ((Collection<Comparable<?>>) 
Plugins.getMemberAccessor().get(ShardingSpherePreparedStatement.class.getDeclaredField("generatedValues"),
 preparedStatement)).add(1L);
+        preparedStatement.clearBatch();
+        ResultSet actual = preparedStatement.getGeneratedKeys();
+        assertThat(actual, not(cachedResultSet));
+        assertFalse(actual.isClosed());
+    }
+}
diff --git a/src/resources/idea/inspections.xml 
b/src/resources/idea/inspections.xml
index ebd966b9a57..70a26d382aa 100644
--- a/src/resources/idea/inspections.xml
+++ b/src/resources/idea/inspections.xml
@@ -824,7 +824,6 @@
   </inspection_tool>
   <inspection_tool class="ThrowsRuntimeException" enabled="true" 
level="WARNING" enabled_by_default="true" />
   <inspection_tool class="TooBroadCatch" enabled="true" level="WARNING" 
enabled_by_default="true" />
-  <inspection_tool class="TooBroadThrows" enabled="true" level="WARNING" 
enabled_by_default="true" />
   <inspection_tool class="TrailingComma" enabled="false" level="WEAK WARNING" 
enabled_by_default="false" />
   <inspection_tool class="TypeCustomizer" enabled="false" level="WARNING" 
enabled_by_default="false" />
   <inspection_tool class="TypeParameterExtendsFinalClass" enabled="true" 
level="WARNING" enabled_by_default="true" />
diff --git 
a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java
 
b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java
index 57c4ef93ae4..e08175a6513 100644
--- 
a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java
+++ 
b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java
@@ -180,24 +180,25 @@ class ShardingPreparedStatementTest extends 
AbstractShardingDriverTest {
             for (int each : result) {
                 assertThat(each, is(4));
             }
-            ResultSet generateKeyResultSet = 
preparedStatement.getGeneratedKeys();
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(11L));
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(12L));
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(13L));
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(14L));
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(15L));
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(16L));
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(17L));
-            assertTrue(generateKeyResultSet.next());
-            assertThat(generateKeyResultSet.getLong(1), is(18L));
-            assertFalse(generateKeyResultSet.next());
+            try (ResultSet generateKeyResultSet = 
preparedStatement.getGeneratedKeys()) {
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(11L));
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(12L));
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(13L));
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(14L));
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(15L));
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(16L));
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(17L));
+                assertTrue(generateKeyResultSet.next());
+                assertThat(generateKeyResultSet.getLong(1), is(18L));
+                assertFalse(generateKeyResultSet.next());
+            }
             try (ResultSet resultSet = 
queryStatement.executeQuery(String.format(SELECT_FOR_INSERT_MULTI_VALUES_WITH_GENERATE_SHARDING_KEY_SQL,
 11L))) {
                 assertTrue(resultSet.next());
                 assertThat(resultSet.getString(1), is("BATCH1"));

Reply via email to