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

wuweijie 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 043258668b5 Fixes #20414 (#20425)
043258668b5 is described below

commit 043258668b5913cfbfc5cd1ad72d3695e6f4081b
Author: O-king <[email protected]>
AuthorDate: Wed Aug 24 15:27:40 2022 +0800

    Fixes #20414 (#20425)
    
    * Fixes #20414
    
    * Fixes #20414
    
    Co-authored-by: oking <[email protected]>
---
 .../sql/prepare/driver/jdbc/StatementOption.java        | 10 ++++++++--
 .../jdbc/core/connection/ShardingSphereConnection.java  |  2 +-
 .../core/statement/ShardingSpherePreparedStatement.java | 17 +++++++++++------
 .../driver/jdbc/core/statement/StatementManager.java    |  4 +++-
 4 files changed, 23 insertions(+), 10 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/jdbc/StatementOption.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/jdbc/StatementOption.java
index cc7d9643841..f4ae56bb850 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/jdbc/StatementOption.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/jdbc/StatementOption.java
@@ -39,11 +39,17 @@ public final class StatementOption implements 
StorageResourceOption {
     
     private final boolean returnGeneratedKeys;
     
+    private final String[] columns;
+    
     public StatementOption(final int resultSetType, final int 
resultSetConcurrency, final int resultSetHoldability) {
-        this(resultSetType, resultSetConcurrency, resultSetHoldability, false);
+        this(resultSetType, resultSetConcurrency, resultSetHoldability, false, 
null);
     }
     
     public StatementOption(final boolean returnGeneratedKeys) {
-        this(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, 
ResultSet.HOLD_CURSORS_OVER_COMMIT, returnGeneratedKeys);
+        this(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, 
ResultSet.HOLD_CURSORS_OVER_COMMIT, returnGeneratedKeys, null);
+    }
+    
+    public StatementOption(final boolean returnGeneratedKeys, final String[] 
columns) {
+        this(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, 
ResultSet.HOLD_CURSORS_OVER_COMMIT, returnGeneratedKeys, columns);
     }
 }
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
index fbbff7f4e58..f36b82d7551 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
@@ -110,7 +110,7 @@ public final class ShardingSphereConnection extends 
AbstractConnectionAdapter {
     
     @Override
     public PreparedStatement prepareStatement(final String sql, final String[] 
columnNames) throws SQLException {
-        return new ShardingSpherePreparedStatement(this, sql, 
Statement.RETURN_GENERATED_KEYS);
+        return new ShardingSpherePreparedStatement(this, sql, columnNames);
     }
     
     @Override
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 591568940dd..4a5f8efe1d7 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -153,24 +153,29 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
     private SQLFederationDeciderContext deciderContext;
     
     public ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql) throws SQLException {
-        this(connection, sql, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT, false);
+        this(connection, sql, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT, false, null);
     }
     
     public ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql, final int resultSetType, final int 
resultSetConcurrency) throws SQLException {
-        this(connection, sql, resultSetType, resultSetConcurrency, 
ResultSet.HOLD_CURSORS_OVER_COMMIT, false);
+        this(connection, sql, resultSetType, resultSetConcurrency, 
ResultSet.HOLD_CURSORS_OVER_COMMIT, false, null);
     }
     
     public ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql, final int autoGeneratedKeys) throws SQLException {
-        this(connection, sql, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT, 
Statement.RETURN_GENERATED_KEYS == autoGeneratedKeys);
+        this(connection, sql, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT, 
Statement.RETURN_GENERATED_KEYS == autoGeneratedKeys, null);
+    }
+    
+    public ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql, final String[] columns) throws SQLException {
+        this(connection, sql, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT, true, columns);
     }
     
     public ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql, final int resultSetType, final int 
resultSetConcurrency,
                                            final int resultSetHoldability) 
throws SQLException {
-        this(connection, sql, resultSetType, resultSetConcurrency, 
resultSetHoldability, false);
+        this(connection, sql, resultSetType, resultSetConcurrency, 
resultSetHoldability, false, null);
     }
     
     private ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql,
-                                            final int resultSetType, final int 
resultSetConcurrency, final int resultSetHoldability, final boolean 
returnGeneratedKeys) throws SQLException {
+                                            final int resultSetType, final int 
resultSetConcurrency, final int resultSetHoldability, final boolean 
returnGeneratedKeys,
+                                            final String[] columns) throws 
SQLException {
         if (Strings.isNullOrEmpty(sql)) {
             SQLExceptionErrorCode errorCode = 
SQLExceptionErrorCode.SQL_STRING_NULL_OR_EMPTY;
             throw new SQLException(errorCode.getErrorMessage(), 
errorCode.getSqlState(), errorCode.getErrorCode());
@@ -187,7 +192,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         sqlStatement = sqlParserEngine.parse(sql, true);
         sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 sqlStatement, connection.getDatabaseName());
         parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
-        statementOption = returnGeneratedKeys ? new StatementOption(true) : 
new StatementOption(resultSetType, resultSetConcurrency, resultSetHoldability);
+        statementOption = returnGeneratedKeys ? new StatementOption(true, 
columns) : new StatementOption(resultSetType, resultSetConcurrency, 
resultSetHoldability);
         executor = new DriverExecutor(connection);
         JDBCExecutor jdbcExecutor = new 
JDBCExecutor(connection.getContextManager().getExecutorEngine(), 
connection.isHoldTransaction());
         batchPreparedStatementExecutor = new 
BatchPreparedStatementExecutor(metaDataContexts, jdbcExecutor, 
connection.getDatabaseName(), eventBusContext);
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/StatementManager.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/StatementManager.java
index c5b6fb96a0c..d1439044d3e 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/StatementManager.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/StatementManager.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.driver.jdbc.core.statement;
 
 import lombok.EqualsAndHashCode;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.ArrayUtils;
 import 
org.apache.shardingsphere.driver.jdbc.adapter.executor.ForceExecuteTemplate;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
@@ -52,7 +53,8 @@ public final class StatementManager implements 
ExecutorJDBCStatementManager, Aut
         Statement result = cachedStatements.get(new CacheKey(executionUnit, 
connectionMode));
         if (null == result) {
             String sql = executionUnit.getSqlUnit().getSql();
-            result = option.isReturnGeneratedKeys() ? 
connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
+            result = option.isReturnGeneratedKeys()
+                    ? (ArrayUtils.isNotEmpty(option.getColumns()) ? 
connection.prepareStatement(sql, option.getColumns()) : 
connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS))
                     : connection.prepareStatement(sql, 
option.getResultSetType(), option.getResultSetConcurrency(), 
option.getResultSetHoldability());
             cachedStatements.put(new CacheKey(executionUnit, connectionMode), 
result);
         }

Reply via email to