This is an automated email from the ASF dual-hosted git repository.
panjuan 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 65be7cf73c0 Fix IndexOutOfBoundsException when execute set variable
statement int jdbc adapter (#24125)
65be7cf73c0 is described below
commit 65be7cf73c07bb029970d09f453487bc66feb385
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sun Feb 12 19:58:03 2023 +0800
Fix IndexOutOfBoundsException when execute set variable statement int jdbc
adapter (#24125)
---
.../statement/ShardingSpherePreparedStatement.java | 7 ++++++-
.../jdbc/core/statement/ShardingSphereStatement.java | 7 ++++++-
.../e2e/discovery/cases/base/BaseDiscoveryE2EIT.java | 4 ++--
.../shardingsphere/test/e2e/cases/SQLCommandType.java | 2 +-
.../test/e2e/cases/assertion/IntegrationTestCase.java | 3 +++
.../test/e2e/engine/dal/GeneralDALE2EIT.java | 18 +++++++++++++++---
.../param/array/E2ETestParameterGenerator.java | 6 +++++-
...al-integration-show.xml => dal-integration-set.xml} | 7 +++++--
.../test/resources/cases/dal/dal-integration-show.xml | 2 +-
.../select_session_variables.xml} | 13 +++++++------
10 files changed, 51 insertions(+), 18 deletions(-)
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 16263969a86..948c61a2b63 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -515,6 +515,9 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
}
if (executionContext.getSqlStatementContext() instanceof
SelectStatementContext ||
executionContext.getSqlStatementContext().getSqlStatement() instanceof
DALStatement) {
List<ResultSet> resultSets = getResultSets();
+ if (resultSets.isEmpty()) {
+ return currentResultSet;
+ }
MergedResult mergedResult =
mergeQuery(getQueryResults(resultSets));
Map<String, Integer> columnLabelAndIndexMap = null !=
this.columnLabelAndIndexMap ? this.columnLabelAndIndexMap
: (this.columnLabelAndIndexMap =
ShardingSphereResultSetUtil.createColumnLabelAndIndexMap(sqlStatementContext,
resultSets.get(0).getMetaData()));
@@ -526,7 +529,9 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private List<ResultSet> getResultSets() throws SQLException {
List<ResultSet> result = new ArrayList<>(statements.size());
for (Statement each : statements) {
- result.add(each.getResultSet());
+ if (null != each.getResultSet()) {
+ result.add(each.getResultSet());
+ }
}
return result;
}
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 1296ad39076..6abd9254e88 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -610,6 +610,9 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
}
if (executionContext.getSqlStatementContext() instanceof
SelectStatementContext ||
executionContext.getSqlStatementContext().getSqlStatement() instanceof
DALStatement) {
List<ResultSet> resultSets = getResultSets();
+ if (resultSets.isEmpty()) {
+ return currentResultSet;
+ }
MergedResult mergedResult =
mergeQuery(getQueryResults(resultSets));
currentResultSet = new ShardingSphereResultSet(resultSets,
mergedResult, this, executionContext);
}
@@ -619,7 +622,9 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
private List<ResultSet> getResultSets() throws SQLException {
List<ResultSet> result = new ArrayList<>(statements.size());
for (Statement each : statements) {
- result.add(each.getResultSet());
+ if (null != each.getResultSet()) {
+ result.add(each.getResultSet());
+ }
}
return result;
}
diff --git
a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java
b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java
index 3cef8147bbc..eb901a19f38 100644
---
a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java
+++
b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java
@@ -131,8 +131,8 @@ public abstract class BaseDiscoveryE2EIT {
mgrEnvironment.getDataSources().remove(getPrimaryDataSourceName());
String closedRoutingDataSourceName =
getCloseReplicationDataSourceName(mgrEnvironment);
mgrEnvironment.getDataSources().remove(closedRoutingDataSourceName);
- Awaitility.await().atMost(Durations.ONE_MINUTE).until(() ->
-
getRouteDataSourceName().equals(Objects.requireNonNull(mgrEnvironment.getDataSources().entrySet().stream().findFirst().orElse(null)).getKey()));
+ Awaitility.await().atMost(Durations.ONE_MINUTE)
+ .until(() ->
getRouteDataSourceName().equals(Objects.requireNonNull(mgrEnvironment.getDataSources().entrySet().stream().findFirst().orElse(null)).getKey()));
}
private String getCloseReplicationDataSourceName(final
DatabaseClusterEnvironment mgrEnvironment) throws SQLException {
diff --git
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/SQLCommandType.java
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/SQLCommandType.java
index e87f4cf5eb2..8d16e72cd9a 100644
---
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/SQLCommandType.java
+++
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/SQLCommandType.java
@@ -72,7 +72,7 @@ public enum SQLCommandType {
/**
* Database administrator Language.
*/
- DAL(DALStatement.class, "dal-integration", true,
Collections.singletonList("proxy")),
+ DAL(DALStatement.class, "dal-integration", true, Arrays.asList("jdbc",
"proxy")),
/**
* Database control Language.
diff --git
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/assertion/IntegrationTestCase.java
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/assertion/IntegrationTestCase.java
index 7c2ae1a9ffd..2c2aedda48b 100644
---
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/assertion/IntegrationTestCase.java
+++
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/cases/assertion/IntegrationTestCase.java
@@ -47,6 +47,9 @@ public final class IntegrationTestCase {
@XmlAttribute(name = "scenario-comments")
private String scenarioComments;
+ @XmlAttribute(name = "adapters")
+ private String adapters;
+
@XmlElement(name = "assertion")
private Collection<IntegrationTestCaseAssertion> assertions = new
LinkedList<>();
}
diff --git
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/dal/GeneralDALE2EIT.java
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/dal/GeneralDALE2EIT.java
index c578f2f22ce..db2daee79b9 100644
---
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/dal/GeneralDALE2EIT.java
+++
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/dal/GeneralDALE2EIT.java
@@ -47,10 +47,22 @@ public final class GeneralDALE2EIT extends BaseDALE2EIT {
@Test
public void assertExecute() throws SQLException, ParseException {
try (Connection connection = getTargetDataSource().getConnection()) {
- try (
- Statement statement = connection.createStatement();
- ResultSet resultSet = statement.executeQuery(getSQL())) {
+ try (Statement statement = connection.createStatement()) {
+ statement.execute(getSQL());
+ assertExecuteResult(statement);
+ }
+ }
+ }
+
+ private void assertExecuteResult(final Statement statement) throws
SQLException {
+ try (ResultSet resultSet = statement.getResultSet()) {
+ if (null == getAssertion().getAssertionSQL()) {
assertResultSet(resultSet);
+ } else {
+ statement.execute(getAssertion().getAssertionSQL().getSql());
+ try (ResultSet assertionSQLResultSet =
statement.getResultSet()) {
+ assertResultSet(assertionSQLResultSet);
+ }
}
}
}
diff --git
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/framework/param/array/E2ETestParameterGenerator.java
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/framework/param/array/E2ETestParameterGenerator.java
index e701e326aad..60810887ec2 100644
---
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/framework/param/array/E2ETestParameterGenerator.java
+++
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/framework/param/array/E2ETestParameterGenerator.java
@@ -104,7 +104,7 @@ public final class E2ETestParameterGenerator {
final
DatabaseType databaseType, final SQLExecuteType sqlExecuteType,
final
IntegrationTestCaseAssertion assertion, final SQLCommandType sqlCommandType) {
Collection<AssertionTestParameter> result = new LinkedList<>();
- for (String each : envAdapters) {
+ for (String each :
getEnvAdapters(testCaseContext.getTestCase().getAdapters())) {
if (sqlCommandType.getRunningAdaptors().contains(each)) {
result.addAll(getAssertionTestParameter(testCaseContext,
assertion, each, databaseType, sqlExecuteType, sqlCommandType));
}
@@ -120,6 +120,10 @@ public final class E2ETestParameterGenerator {
.map(each -> new AssertionTestParameter(testCaseContext,
assertion, adapter, each, envMode, databaseType,
sqlExecuteType)).collect(Collectors.toList());
}
+ private Collection<String> getEnvAdapters(final String envAdapters) {
+ return Strings.isNullOrEmpty(envAdapters) ? this.envAdapters :
Splitter.on(',').trimResults().splitToList(envAdapters);
+ }
+
private boolean filterScenarios(final String scenario, final
Collection<String> scenarios, final Class<? extends SQLStatement>
sqlStatementClass) {
if (sqlStatementClass == RALStatement.class) {
return "empty_rules".equals(scenario);
diff --git
a/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
b/test/e2e/suite/src/test/resources/cases/dal/dal-integration-set.xml
similarity index 70%
copy from test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
copy to test/e2e/suite/src/test/resources/cases/dal/dal-integration-set.xml
index 9bdba74996f..03e14948c4c 100644
--- a/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
+++ b/test/e2e/suite/src/test/resources/cases/dal/dal-integration-set.xml
@@ -17,7 +17,10 @@
-->
<integration-test-cases>
- <test-case sql="SHOW DATABASES" db-types="MySQL"
scenario-types="dbtbl_with_readwrite_splitting,readwrite_splitting,dbtbl_with_readwrite_splitting_and_encrypt,sharding_and_encrypt,encrypt_and_readwrite_splitting">
- <assertion expected-data-file="show_databases.xml" />
+ <!-- TODO support set variable statement for proxy adapter in issue #24124
-->
+ <test-case sql="SET @order_id := 1, @item_id := 2" db-types="MySQL"
scenario-types="db,tbl,readwrite_splitting,encrypt,shadow" adapters="jdbc">
+ <assertion expected-data-file="select_session_variables.xml">
+ <assertion-sql sql="SELECT @order_id, @item_id" />
+ </assertion>
</test-case>
</integration-test-cases>
diff --git
a/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
b/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
index 9bdba74996f..f550610a5b6 100644
--- a/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
+++ b/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
@@ -17,7 +17,7 @@
-->
<integration-test-cases>
- <test-case sql="SHOW DATABASES" db-types="MySQL"
scenario-types="dbtbl_with_readwrite_splitting,readwrite_splitting,dbtbl_with_readwrite_splitting_and_encrypt,sharding_and_encrypt,encrypt_and_readwrite_splitting">
+ <test-case sql="SHOW DATABASES" db-types="MySQL"
scenario-types="dbtbl_with_readwrite_splitting,readwrite_splitting,dbtbl_with_readwrite_splitting_and_encrypt,sharding_and_encrypt,encrypt_and_readwrite_splitting"
adapters="proxy">
<assertion expected-data-file="show_databases.xml" />
</test-case>
</integration-test-cases>
diff --git
a/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
b/test/e2e/suite/src/test/resources/cases/dal/dataset/select_session_variables.xml
similarity index 67%
copy from test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
copy to
test/e2e/suite/src/test/resources/cases/dal/dataset/select_session_variables.xml
index 9bdba74996f..8f2417ea666 100644
--- a/test/e2e/suite/src/test/resources/cases/dal/dal-integration-show.xml
+++
b/test/e2e/suite/src/test/resources/cases/dal/dataset/select_session_variables.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
@@ -16,8 +15,10 @@
~ limitations under the License.
-->
-<integration-test-cases>
- <test-case sql="SHOW DATABASES" db-types="MySQL"
scenario-types="dbtbl_with_readwrite_splitting,readwrite_splitting,dbtbl_with_readwrite_splitting_and_encrypt,sharding_and_encrypt,encrypt_and_readwrite_splitting">
- <assertion expected-data-file="show_databases.xml" />
- </test-case>
-</integration-test-cases>
+<dataset>
+ <metadata>
+ <column name="@order_id" />
+ <column name="@item_id" />
+ </metadata>
+ <row values="1, 2" />
+</dataset>