Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-5425

Updateable holdable ResultSet terminates early after 65638 updates

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 10.7.1.1
    • 10.8.3.0, 10.9.2.2, 10.10.1.1
    • JDBC
    • Normal
    • Repro attached
    • Seen in production, Wrong query result

    Description

      After at least 65638 updates to an indexed column have been done via an updateable holdable resultset and the transaction is committed ResultSet.next() returns false even if more rows exist to be returned.

      The following program should output "Total: 100000" but instead outputs "Total: 65638".

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

      public class DerbyBug {
      public static void main(String[] args) throws ClassNotFoundException, SQLException {
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      Connection conn = DriverManager.getConnection("jdbc:derby:TestDB;create=true");

      conn.setAutoCommit(false);

      Statement createStmt = conn.createStatement();
      createStmt.executeUpdate("CREATE TABLE test (a INT)");
      createStmt.executeUpdate("CREATE INDEX idxa ON test(a)");
      createStmt.close();

      PreparedStatement insertStmt = conn.prepareStatement("INSERT INTO test(a) VALUES ");

      for (int i = 0; i < 100000; ++i)

      { insertStmt.setInt(1, i); insertStmt.executeUpdate(); }

      insertStmt.close();

      conn.commit();

      Statement selectStmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE, ResultSet.HOLD_CURSORS_OVER_COMMIT);
      ResultSet rs = selectStmt.executeQuery("SELECT a FROM test FOR UPDATE");

      int count = 0;
      while (rs.next())

      { rs.updateInt(1, count); rs.updateRow(); count++; conn.commit(); }

      rs.close();
      selectStmt.close();
      conn.commit();
      conn.close();

      System.out.println("Total: " + count);

      try

      { DriverManager.getConnection("jdbc:derby:;shutdown=true"); }

      catch (SQLException e) {
      if (!e.getSQLState().equals("XJ015"))

      { throw e; }

      }
      }
      }

      Attachments

        1. holdable-row-holders.diff.txt
          3 kB
          Knut Anders Hatlen
        2. DerbyBug.java
          2 kB
          Andrew Johnson
        3. d5425-1a.diff.txt
          23 kB
          Knut Anders Hatlen

        Issue Links

          Activity

            People

              knutanders Knut Anders Hatlen
              tehlaser Andrew Johnson
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: