package org.mariadb.jdbc;
import org.junit.BeforeClass;
import org.junit.Test;
import java.sql.*;
import static org.junit.Assert.*;
public class GeneratedKeysTest extends BaseTest {
/**
* Initialisation.
*
* @throws SQLException exception
*/
@BeforeClass()
public static void initClass() throws SQLException {
createTable("gen_key_test", "id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY (id)");
createTable("gen_key_test2", "id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY (id)");
}
@Test
public void testSimpleGeneratedKeys() throws SQLException {
Statement statement = sharedConnection.createStatement();
statement.execute("truncate gen_key_test");
statement.executeUpdate("INSERT INTO gen_key_test (id, name) VALUES (null, 'Dave')",
Statement.RETURN_GENERATED_KEYS);
ResultSet resultSet = statement.getGeneratedKeys();
assertTrue(resultSet.next());
assertEquals(1, resultSet.getInt(1));
}
@Test
public void testSimpleGeneratedKeysWithPreparedStatement() throws SQLException {
sharedConnection.createStatement().execute("truncate gen_key_test");
PreparedStatement preparedStatement = sharedConnection.prepareStatement(
"INSERT INTO gen_key_test (id, name) VALUES (null, ?)",
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, "Dave");
preparedStatement.execute();
ResultSet resultSet = preparedStatement.getGeneratedKeys();
assertTrue(resultSet.next());
assertEquals(1, resultSet.getInt(1));
}
@Test
public void testGeneratedKeysInsertOnDuplicateUpdate() throws SQLException {
Statement statement = sharedConnection.createStatement();
statement.execute("truncate gen_key_test");
statement.execute("INSERT INTO gen_key_test (id, name) VALUES (null, 'Dave')");
statement.executeUpdate(
"INSERT INTO gen_key_test (id, name) VALUES (1, 'Dave') ON DUPLICATE KEY UPDATE id = id",
Statement.RETURN_GENERATED_KEYS);
//From the Javadoc: "If this Statement object did not generate any keys, an empty ResultSet object is returned."
ResultSet resultSet = statement.getGeneratedKeys();
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
assertEquals(1, resultSetMetaData.getColumnCount());
//Since the statement does not generate any keys an empty ResultSet should be returned
assertFalse(resultSet.next());
}
/**
* CONJ-284: Cannot read autoincremented IDs bigger than Short.MAX_VALUE.
*
* @throws SQLException exception
*/
@Test
public void testGeneratedKeysNegativeValue() throws SQLException {
Statement statement = sharedConnection.createStatement();
statement.execute("ALTER TABLE gen_key_test2 AUTO_INCREMENT = 65500");
PreparedStatement preparedStatement = sharedConnection.prepareStatement("INSERT INTO gen_key_test2 (name) VALUES (?)");
preparedStatement.setString(1, "t");
preparedStatement.execute();
ResultSet rs = preparedStatement.getGeneratedKeys();
rs.next();
assertEquals(65500, rs.getInt(1));
}
}