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 <[email protected]>
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());
}
}