package org.mariadb.jdbc; import org.junit.BeforeClass; import org.junit.Test; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import static org.junit.Assert.*; public class GeneratedTest extends BaseTest { /** * Tables initialisation. * * @throws SQLException exception */ @BeforeClass() public static void initClass() throws SQLException { createTable("genkeys", "priKey INT NOT NULL AUTO_INCREMENT, dataField VARCHAR(64), PRIMARY KEY (priKey)"); } /* Test with different APIs that generated keys work. Also test that any name in generatedKeys.getXXX(String name) can be passed and is equivalent to generatedKeys.getXXX(1). This might not be 100% compliant, but is a simple and effective solution for MySQL that does not does not support more than a single autogenerated value. */ @Test public void generatedKeys() throws Exception { Statement st = sharedConnection.createStatement(); st.executeUpdate("insert into genkeys(dataField) values('a')", Statement.RETURN_GENERATED_KEYS); ResultSet rs = st.getGeneratedKeys(); assertTrue(rs.next()); assertEquals(rs.getInt(1), 1); assertEquals(rs.getInt("priKey"), 1); assertEquals(rs.getInt("foo"), 1); int[] indexes = {1, 2, 3}; st.executeUpdate("insert into genkeys(dataField) values('b')", indexes); rs = st.getGeneratedKeys(); assertTrue(rs.next()); assertEquals(rs.getInt(1), 2); try { assertEquals(rs.getInt(2), 2); assertFalse("should never get here", true); } catch (SQLException e) { // eat } String[] columnNames = {"priKey", "Alice", "Bob"}; st.executeUpdate("insert into genkeys(dataField) values('c')", columnNames); rs = st.getGeneratedKeys(); assertTrue(rs.next()); for (int i = 0; i < 3; i++) { assertEquals(rs.getInt(columnNames[i]), 3); } } }