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);
}