db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Johnson (JIRA)" <j...@apache.org>
Subject [jira] [Created] (DERBY-5425) Updateable holdable ResultSet terminates early after 65638 updates
Date Tue, 20 Sep 2011 21:52:08 GMT
Updateable holdable ResultSet terminates early after 65638 updates
------------------------------------------------------------------

                 Key: DERBY-5425
                 URL: https://issues.apache.org/jira/browse/DERBY-5425
             Project: Derby
          Issue Type: Bug
          Components: JDBC
    Affects Versions: 10.7.1.1
         Environment: ------------------ Java Information ------------------
Java Version:    1.6.0_26
Java Vendor:     Sun Microsystems Inc.
Java home:       D:\Program Files (x86)\Java\jre6
Java classpath:  .;..\derby.jar
OS name:         Windows 7
OS architecture: x86
OS version:      6.1
Java user name:  Andrew
Java user home:  D:\Users\Andrew
Java user dir:   E:\workspace\DerbyBug\bin
java.specification.name: Java Platform API Specification
java.specification.version: 1.6
java.runtime.version: 1.6.0_26-b03
--------- Derby Information --------
JRE - JDBC: Java SE 6 - JDBC 4.0
[E:\workspace\DerbyBug\derby.jar] 10.7.1.1 - (1040133)
------------------------------------------------------
----------------- Locale Information -----------------
------------------------------------------------------
            Reporter: Andrew Johnson


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;
			}
		}
	}
}


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message