Details
- 
    Bug 
- 
    Status: Closed (View Workflow)
- 
    Major 
- 
    Resolution: Fixed
- 
    2.4.0
- 
    None
- 
    n/a
Description
When INSERT ... ON DUPLICATE KEY UPDATE statement updated a row, the ResultSet returned from getGeneratedKeys() contains two rows.
Here is a failing test case (I wrote it in MultiTest).
| @Test | 
| public void shouldDuplicateKeyUpdateNotReturnExtraRows() throws Throwable { | 
| try (Connection con = openNewConnection(connUri, new Properties())) { | 
| try (Statement stmt = con.createStatement()) { | 
| stmt.execute("truncate table testMultiGeneratedKey"); | 
|       } | 
| try (PreparedStatement pstmt = con.prepareStatement( | 
| "INSERT INTO testMultiGeneratedKey (id, text) VALUES (?, ?) " | 
| + "ON DUPLICATE KEY UPDATE text = VALUES(text)", | 
|           Statement.RETURN_GENERATED_KEYS)) { | 
| // Insert a row. | 
| pstmt.setInt(1, 1); | 
| pstmt.setString(2, "initial"); | 
| assertEquals(1, pstmt.executeUpdate()); | 
| try (ResultSet rs = pstmt.getGeneratedKeys()) { | 
|           assertTrue(rs.next()); | 
| assertEquals(1, rs.getInt(1)); | 
|           assertFalse(rs.next()); | 
|         } | 
| // Update the row. | 
| pstmt.setInt(1, 1); | 
| pstmt.setString(2, "updated"); | 
| assertEquals(2, pstmt.executeUpdate()); | 
| try (ResultSet rs = pstmt.getGeneratedKeys()) { | 
|           assertTrue(rs.next()); | 
| assertEquals(1, rs.getInt(1)); | 
|           assertFalse(rs.next()); | 
|         } | 
|       } | 
|     } | 
|   }
 | 
getGeneratedKeys() ultimately calls org.mariadb.jdbc.internal.com.read.dao.CmdInformationSingle.getGeneratedKeys(Protocol).
In this method, updateCount is used as the size of returned result set, however, updateCount is 2 when INSERT ... ON DUPLICATE KEY UPDATE statement updated a row according to the doc.
Attachments
Issue Links
- relates to
- 
                    CONJ-706 getGeneratedKey implementation correction for multiple result for one query -         
- Closed
 
-