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

Reply via email to