import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;

public class InsertRowTest
{
    public static void main(String[] args)
        throws Exception
    {
        Connection conn = null;
        Statement s = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try
        {
            conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "test", "test");

            s = conn.createStatement();

            s.executeUpdate("CREATE TABLE IF NOT EXISTS test (id INTEGER, PRIMARY KEY(id))");

            /*
              s.executeUpdate("TRUNCATE test");

              s.executeUpdate("INSERT INTO test (id) VALUES (1)");
            */

            conn.setAutoCommit(false); // BEGIN
            ps = conn.prepareStatement("SELECT id FROM test WHERE id=2 FOR UPDATE",
                                       ResultSet.TYPE_FORWARD_ONLY,
                                       ResultSet.CONCUR_UPDATABLE);


            rs = ps.executeQuery();

            if(rs.next())
            {
                // Problem!
                System.err.println("Unexpected data");
                System.exit(1);
            }

            rs.moveToInsertRow();

            rs.updateInt("id", 1);

            try
            {
                rs.updateRow();

                System.err.println("FAIL: ResultSet.updateRow fails to throw SQLException when cursor is on insert row");
            }
            catch(SQLException sqle)
            {
                // Expected
                System.err.println("PASS: ResultSet.updateRow throws SQLException when cursor is on insert row");
            }

            rs.close();

            conn.commit();
        }
        finally
        {
            if(null != rs) try { rs.close(); } catch (SQLException sqle)
            { System.err.println("Error closing result set"); sqle.printStackTrace(); }

            if(null != ps) try { ps.close(); } catch (SQLException sqle)
            { System.err.println("Error closing prepared statement"); sqle.printStackTrace(); }

            if(null != s) try { s.close(); } catch (SQLException sqle)
            { System.err.println("Error closing statement"); sqle.printStackTrace(); }

            if(null != conn) try { conn.close(); } catch (SQLException sqle)
            { System.err.println("Error closing connection"); sqle.printStackTrace(); }
        }
    }
}
