You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by wu...@apache.org on 2022/08/24 07:27:50 UTC
[shardingsphere] branch master updated: Fixes #20414 (#20425)
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 <ol...@hotmail.com>
AuthorDate: Wed Aug 24 15:27:40 2022 +0800
Fixes #20414 (#20425)
* Fixes #20414
* Fixes #20414
Co-authored-by: oking <xi...@gmail.com>
---
.../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);
}