You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2020/09/22 06:30:08 UTC
[shardingsphere] branch master updated: Fix bug for return
generated key (#7551)
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 d5289dd Fix bug for return generated key (#7551)
d5289dd is described below
commit d5289ddd2b013267b3778dcd1330391100e66df2
Author: Liang Zhang <te...@163.com>
AuthorDate: Tue Sep 22 14:25:33 2020 +0800
Fix bug for return generated key (#7551)
* Refactor ShardingSpherePreparedStatementTest
* Return all gen key
* Fix bug for return generated key
* Add more test case
---
...ngGeneratedKeyInsertValueParameterRewriter.java | 2 +-
.../GeneratedKeyAssignmentTokenGenerator.java | 2 +-
.../GeneratedKeyInsertValuesTokenGenerator.java | 2 +-
.../statement/ShardingSpherePreparedStatement.java | 2 +-
.../ShardingSpherePreparedStatementTest.java | 27 ++++++++++++++++++----
.../segment/insert/keygen/GeneratedKeyContext.java | 3 ++-
.../engine/GeneratedKeyContextEngineTest.java | 8 ++++---
7 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java
index 203abb6..5194b0b 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/parameter/impl/ShardingGeneratedKeyInsertValueParameterRewriter.java
@@ -45,7 +45,7 @@ public final class ShardingGeneratedKeyInsertValueParameterRewriter implements P
public void rewrite(final ParameterBuilder parameterBuilder, final InsertStatementContext insertStatementContext, final List<Object> parameters) {
Preconditions.checkState(insertStatementContext.getGeneratedKeyContext().isPresent());
((GroupedParameterBuilder) parameterBuilder).setDerivedColumnName(insertStatementContext.getGeneratedKeyContext().get().getColumnName());
- Iterator<Comparable<?>> generatedValues = insertStatementContext.getGeneratedKeyContext().get().getGeneratedValues().descendingIterator();
+ Iterator<Comparable<?>> generatedValues = insertStatementContext.getGeneratedKeyContext().get().getGeneratedValues().iterator();
int count = 0;
int parameterCount = 0;
for (List<Object> each : insertStatementContext.getGroupedParameters()) {
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyAssignmentTokenGenerator.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyAssignmentTokenGenerator.java
index d7ba9b6..a3e9fac 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyAssignmentTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyAssignmentTokenGenerator.java
@@ -51,7 +51,7 @@ public final class GeneratedKeyAssignmentTokenGenerator extends BaseGeneratedKey
InsertStatement insertStatement = insertStatementContext.getSqlStatement();
Preconditions.checkState(InsertStatementHelper.getSetAssignmentSegment(insertStatement).isPresent());
int startIndex = InsertStatementHelper.getSetAssignmentSegment(insertStatement).get().getStopIndex() + 1;
- return parameters.isEmpty() ? new LiteralGeneratedKeyAssignmentToken(startIndex, generatedKey.get().getColumnName(), generatedKey.get().getGeneratedValues().getLast())
+ return parameters.isEmpty() ? new LiteralGeneratedKeyAssignmentToken(startIndex, generatedKey.get().getColumnName(), generatedKey.get().getGeneratedValues().iterator().next())
: new ParameterMarkerGeneratedKeyAssignmentToken(startIndex, generatedKey.get().getColumnName());
}
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyInsertValuesTokenGenerator.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyInsertValuesTokenGenerator.java
index c49f3d8..1b5ee3d 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyInsertValuesTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/keygen/GeneratedKeyInsertValuesTokenGenerator.java
@@ -54,7 +54,7 @@ public final class GeneratedKeyInsertValuesTokenGenerator extends BaseGeneratedK
Preconditions.checkState(result.isPresent());
Optional<GeneratedKeyContext> generatedKey = insertStatementContext.getGeneratedKeyContext();
Preconditions.checkState(generatedKey.isPresent());
- Iterator<Comparable<?>> generatedValues = generatedKey.get().getGeneratedValues().descendingIterator();
+ Iterator<Comparable<?>> generatedValues = generatedKey.get().getGeneratedValues().iterator();
int count = 0;
for (InsertValueContext each : insertStatementContext.getInsertValueContexts()) {
InsertValue insertValueToken = result.get().getInsertValues().get(count);
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 48a03bc..24b4a68 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
@@ -255,7 +255,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
private ExecutionContext createExecutionContext() {
LogicSQLContext logicSQLContext = new LogicSQLContext(schemaContexts.getDefaultSchemaContext(), sql, new ArrayList<>(getParameters()), sqlStatement);
ExecutionContext result = new KernelProcessor().generateExecutionContext(logicSQLContext, schemaContexts.getProps());
- findGeneratedKey(result).ifPresent(generatedKey -> generatedValues.add(generatedKey.getGeneratedValues().getLast()));
+ findGeneratedKey(result).ifPresent(generatedKey -> generatedValues.addAll(generatedKey.getGeneratedValues()));
logSQL(result);
return result;
}
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
index af5f6f9..efc82b4 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.driver.jdbc.core.statement;
import com.google.common.collect.Lists;
import org.apache.shardingsphere.driver.common.base.AbstractShardingSphereDataSourceForShardingTest;
import org.apache.shardingsphere.driver.fixture.ResetIncrementKeyGenerateAlgorithm;
-import org.junit.Ignore;
import org.junit.Test;
import java.sql.Connection;
@@ -40,12 +39,14 @@ public final class ShardingSpherePreparedStatementTest extends AbstractShardingS
private static final String INSERT_MULTI_VALUES_WITH_GENERATE_SHARDING_KEY_SQL = "INSERT INTO t_user (name) VALUES (?),(?),(?),(?)";
- private static final String SELECT_FOR_INSERT_MULTI_VALUES_WITH_GENERATE_SHARDING_KEY_SQL = "SELECT name FROM t_user WHERE id=%d";
+ private static final String SELECT_FOR_INSERT_MULTI_VALUES_WITH_GENERATE_SHARDING_KEY_SQL = "SELECT name FROM t_user WHERE id=%dL";
private static final String INSERT_WITH_GENERATE_KEY_SQL = "INSERT INTO t_order_item (item_id, order_id, user_id, status) VALUES (?, ?, ?, ?)";
private static final String INSERT_WITHOUT_GENERATE_KEY_SQL = "INSERT INTO t_order_item (order_id, user_id, status) VALUES (?, ?, ?)";
+ private static final String INSERT_WITH_GENERATE_KEY_SQL_WITH_MULTI_VALUES = "INSERT INTO t_order_item (item_id, order_id, user_id, status) VALUES (1, ?, ?, ?), (2, ?, ?, ?)";
+
private static final String INSERT_ON_DUPLICATE_KEY_SQL = "INSERT INTO t_order_item (item_id, order_id, user_id, status) VALUES (?, ?, ?, ?), (?, ?, ?, ?) ON DUPLICATE KEY UPDATE status = ?";
private static final String SELECT_SQL_WITHOUT_PARAMETER_MARKER = "SELECT item_id FROM t_order_item WHERE user_id = %d AND order_id= %s AND status = 'BATCH'";
@@ -94,7 +95,6 @@ public final class ShardingSpherePreparedStatementTest extends AbstractShardingS
}
}
- @Ignore
@Test
public void assertMultiValuesWithGenerateShardingKeyColumn() throws SQLException {
try (
@@ -137,7 +137,6 @@ public final class ShardingSpherePreparedStatementTest extends AbstractShardingS
}
}
- @Ignore
@Test
public void assertAddBatchMultiValuesWithGenerateShardingKeyColumn() throws SQLException {
try (
@@ -327,6 +326,26 @@ public final class ShardingSpherePreparedStatementTest extends AbstractShardingS
}
@Test
+ public void assertGeneratedKeysForBatchInsert() throws SQLException {
+ try (Connection connection = getShardingSphereDataSource().getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(INSERT_WITH_GENERATE_KEY_SQL_WITH_MULTI_VALUES, Statement.RETURN_GENERATED_KEYS)) {
+ preparedStatement.setInt(1, 11);
+ preparedStatement.setInt(2, 11);
+ preparedStatement.setString(3, "MULTI");
+ preparedStatement.setInt(4, 12);
+ preparedStatement.setInt(5, 12);
+ preparedStatement.setString(6, "MULTI");
+ int result = preparedStatement.executeUpdate();
+ ResultSet generateKeyResultSet = preparedStatement.getGeneratedKeys();
+ assertThat(result, is(2));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getInt(1), is(1));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getInt(1), is(2));
+ }
+ }
+
+ @Test
public void assertAddOnDuplicateKey() throws SQLException {
int itemId = 1;
int userId1 = 101;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/GeneratedKeyContext.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/GeneratedKeyContext.java
index 81aaeee..c064283 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/GeneratedKeyContext.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/main/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/GeneratedKeyContext.java
@@ -21,6 +21,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
+import java.util.Collection;
import java.util.LinkedList;
/**
@@ -35,5 +36,5 @@ public final class GeneratedKeyContext {
private final boolean generated;
- private final LinkedList<Comparable<?>> generatedValues = new LinkedList<>();
+ private final Collection<Comparable<?>> generatedValues = new LinkedList<>();
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java
index 76b7ea6..6b3523a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-binder/src/test/java/org/apache/shardingsphere/sql/parser/binder/segment/insert/keygen/engine/GeneratedKeyContextEngineTest.java
@@ -43,6 +43,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.sql.Types;
import java.util.Collections;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
import java.util.Optional;
@@ -164,9 +165,10 @@ public final class GeneratedKeyContextEngineTest {
Optional<GeneratedKeyContext> actual = new GeneratedKeyContextEngine(schemaMetaData).createGenerateKeyContext(Collections.singletonList(1), insertStatement);
assertTrue(actual.isPresent());
assertThat(actual.get().getGeneratedValues().size(), is(3));
- assertThat(actual.get().getGeneratedValues().get(0), is((Comparable) 1));
- assertThat(actual.get().getGeneratedValues().get(1), is((Comparable) 100));
- assertThat(actual.get().getGeneratedValues().get(2), is((Comparable) "value"));
+ Iterator<Comparable<?>> generatedValuesIterator = actual.get().getGeneratedValues().iterator();
+ assertThat(generatedValuesIterator.next(), is((Comparable) 1));
+ assertThat(generatedValuesIterator.next(), is((Comparable) 100));
+ assertThat(generatedValuesIterator.next(), is((Comparable) "value"));
assertTrue(new GeneratedKeyContextEngine(schemaMetaData).createGenerateKeyContext(Collections.singletonList(1), insertStatement).isPresent());
}
}