Skip to content

ResultSet.beforeFirst() Unexpectedly Succeeds on TYPE_FORWARD_ONLY ResultSet #597

@dwenking

Description

@dwenking

According to JDBC specifications, invoking beforeFirst() on a TYPE_FORWARD_ONLY ResultSet should either throw a SQLException or have no effect, as TYPE_FORWARD_ONLY ResultSets do not support cursor movements other than forward.
In the provided test case, a ResultSet is created with TYPE_FORWARD_ONLY and CONCUR_READ_ONLY parameters. After iterating through the ResultSet using rs.next(), an attempt is made to reset the cursor to the beginning of the ResultSet using rs.beforeFirst(). Contrary to expectations, this operation does not throw an error and appears to succeed.

@Test
public void test() {
    try (Connection con = DriverManager.getConnection("jdbc:pgsql://localhost:5432/test13?user=user&password=password")) {
        Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        stmt.execute("CREATE TABLE table13_0 (id INT PRIMARY KEY, name VARCHAR(20))");
        stmt.execute("INSERT INTO table13_0 VALUES (1, 'name1'), (2, 'name2'), (3, 'name3')");
        ResultSet rs = stmt.executeQuery("SELECT * FROM table13_0");
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getString(2));
        }
        rs.beforeFirst(); // expected throw error for ResultSet.TYPE_FORWARD_ONLY
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getString(2));
        }
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions